mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-26 21:18:49 +00:00
build tutorial
This commit is contained in:
parent
f0a96ba75d
commit
8339d18e0a
14
docs/dist/tonal.js
vendored
14
docs/dist/tonal.js
vendored
@ -18,7 +18,8 @@ export function intervalDirection(from, to, direction = 1) {
|
|||||||
}
|
}
|
||||||
function scaleTranspose(scale, offset, note) {
|
function scaleTranspose(scale, offset, note) {
|
||||||
let [tonic, scaleName] = Scale.tokenize(scale);
|
let [tonic, scaleName] = Scale.tokenize(scale);
|
||||||
const {notes} = Scale.get(`${tonic} ${scaleName}`);
|
let {notes} = Scale.get(`${tonic} ${scaleName}`);
|
||||||
|
notes = notes.map((note2) => Note.get(note2).pc);
|
||||||
offset = Number(offset);
|
offset = Number(offset);
|
||||||
if (isNaN(offset)) {
|
if (isNaN(offset)) {
|
||||||
throw new Error(`scale offset "${offset}" not a number`);
|
throw new Error(`scale offset "${offset}" not a number`);
|
||||||
@ -64,7 +65,16 @@ Pattern.prototype._scaleTranspose = function(offset) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype._scale = function(scale) {
|
Pattern.prototype._scale = function(scale) {
|
||||||
return this._mapNotes((value) => ({...value, scale}));
|
return this._mapNotes((value) => {
|
||||||
|
let note = value.value;
|
||||||
|
const asNumber = Number(note);
|
||||||
|
if (!isNaN(asNumber)) {
|
||||||
|
let [tonic, scaleName] = Scale.tokenize(scale);
|
||||||
|
const {pc, oct = 3} = Note.get(tonic);
|
||||||
|
note = scaleTranspose(pc + " " + scaleName, asNumber, pc + oct);
|
||||||
|
}
|
||||||
|
return {...value, value: note, scale};
|
||||||
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype.define("transpose", (a, pat) => pat.transpose(a), {composable: true, patternified: true});
|
Pattern.prototype.define("transpose", (a, pat) => pat.transpose(a), {composable: true, patternified: true});
|
||||||
Pattern.prototype.define("scale", (a, pat) => pat.scale(a), {composable: true, patternified: true});
|
Pattern.prototype.define("scale", (a, pat) => pat.scale(a), {composable: true, patternified: true});
|
||||||
|
|||||||
12
docs/dist/voicings.js
vendored
12
docs/dist/voicings.js
vendored
@ -22,16 +22,14 @@ Pattern.prototype.voicings = function(range) {
|
|||||||
return stack(...lastVoicing);
|
return stack(...lastVoicing);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype.chordBass = function() {
|
Pattern.prototype.rootNotes = function(octave = 2) {
|
||||||
return this._mapNotes((value) => {
|
return this._mapNotes((value) => {
|
||||||
console.log("value", value);
|
const [_, root] = value.value.match(/^([a-gA-G])[b#]?.*$/);
|
||||||
const [_, root] = value.value.match(/^([a-gC-G])[b#]?.*$/);
|
const bassNote = root + octave;
|
||||||
const bassNote = root + "2";
|
|
||||||
return {...value, value: bassNote};
|
return {...value, value: bassNote};
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype.define("voicings", (range, pat) => pat.voicings(range), {composable: true});
|
Pattern.prototype.define("voicings", (range, pat) => pat.voicings(range), {composable: true});
|
||||||
Pattern.prototype.define("chordBass", (pat) => {
|
Pattern.prototype.define("rootNotes", (pat) => {
|
||||||
console.log("call chordBass ...", pat);
|
return pat.rootNotes();
|
||||||
return pat.chordBass();
|
|
||||||
}, {composable: true});
|
}, {composable: true});
|
||||||
|
|||||||
@ -7676,17 +7676,42 @@ synth('sawtooth16').gain('[.2 .8]*8'.m).slow(4)`,
|
|||||||
tune: `"c2 c3".m.
|
tune: `"c2 c3".m.
|
||||||
synth('sawtooth16').autofilter('<1 4 8>'.m)`,
|
synth('sawtooth16').autofilter('<1 4 8>'.m)`,
|
||||||
mdxType: "MiniRepl"
|
mdxType: "MiniRepl"
|
||||||
}), /*#__PURE__*/ _react1.mdx("h2", null, `Tonal API`), /*#__PURE__*/ _react1.mdx("p", null, `TODO, see`), /*#__PURE__*/ _react1.mdx("ul", null, /*#__PURE__*/ _react1.mdx("li", {
|
}), /*#__PURE__*/ _react1.mdx("h2", null, `Tonal API`), /*#__PURE__*/ _react1.mdx("p", null, `The Tonal API, uses `, /*#__PURE__*/ _react1.mdx("a", {
|
||||||
parentName: "ul"
|
parentName: "p",
|
||||||
}, /*#__PURE__*/ _react1.mdx("a", {
|
"href": "https://github.com/tonaljs/tonal"
|
||||||
parentName: "li",
|
}, `tonaljs`), ` to provide helpers for musical operations.`), /*#__PURE__*/ _react1.mdx("h3", null, `transpose(semitones)`), /*#__PURE__*/ _react1.mdx("p", null, `Transposes all notes to the given number of semitones:`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
"href": "https://github.com/tidalcycles/strudel/blob/main/repl/src/tonal.ts"
|
tune: `"c2 c3".m.fast(2).transpose('<0 -2 5 3>'.m.slow(2)).transpose(0)`,
|
||||||
}, `https://github.com/tidalcycles/strudel/blob/main/repl/src/tonal.ts`)), /*#__PURE__*/ _react1.mdx("li", {
|
mdxType: "MiniRepl"
|
||||||
parentName: "ul"
|
}), /*#__PURE__*/ _react1.mdx("p", null, `This method gets really exciting when we use it with a pattern as above.`), /*#__PURE__*/ _react1.mdx("p", null, `Instead of numbers, scientific interval notation can be used as well:`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
}, /*#__PURE__*/ _react1.mdx("a", {
|
tune: `"c2 c3".m.fast(2).transpose('<1P -2M 4P 3m>'.m.slow(2)).transpose(1)`,
|
||||||
parentName: "li",
|
mdxType: "MiniRepl"
|
||||||
"href": "https://github.com/tidalcycles/strudel/blob/main/repl/src/voicings.ts"
|
}), /*#__PURE__*/ _react1.mdx("h3", null, `scale(name)`), /*#__PURE__*/ _react1.mdx("p", null, `Turns numbers into notes in the scale (zero indexed). Also sets scale for other scale operations, like scaleTranpose.`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
}, `https://github.com/tidalcycles/strudel/blob/main/repl/src/voicings.ts`))), /*#__PURE__*/ _react1.mdx("h2", null, `MIDI API`), /*#__PURE__*/ _react1.mdx("p", null, `TODO, see `, /*#__PURE__*/ _react1.mdx("a", {
|
tune: `"0 2 4 6 4 2".m
|
||||||
|
.scale(slowcat('C2 major', 'C2 minor').slow(2))`,
|
||||||
|
mdxType: "MiniRepl"
|
||||||
|
}), /*#__PURE__*/ _react1.mdx("p", null, `Note that the scale root is octaved here. You can also omit the octave, then index zero will default to octave 3.`), /*#__PURE__*/ _react1.mdx("p", null, `All the available scale names can be found `, /*#__PURE__*/ _react1.mdx("a", {
|
||||||
|
parentName: "p",
|
||||||
|
"href": "https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts"
|
||||||
|
}, `here`), `.`), /*#__PURE__*/ _react1.mdx("h3", null, `scaleTranspose(steps)`), /*#__PURE__*/ _react1.mdx("p", null, `Transposes notes inside the scale by the number of steps:`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
|
tune: `"-8 [2,4,6]".m
|
||||||
|
.scale('C4 bebop major')
|
||||||
|
.scaleTranspose('<0 -1 -2 -3 -4 -5 -6 -4>'.m)`,
|
||||||
|
mdxType: "MiniRepl"
|
||||||
|
}), /*#__PURE__*/ _react1.mdx("h3", null, `voicings(range?)`), /*#__PURE__*/ _react1.mdx("p", null, `Turns chord symbols into voicings, using the smoothest voice leading possible:`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
|
tune: `stack("<C^7 A7 Dm7 G7>".m.voicings(), '<C3 A2 D3 G2>'.m)`,
|
||||||
|
mdxType: "MiniRepl"
|
||||||
|
}), /*#__PURE__*/ _react1.mdx("p", null, `TODO: use voicing collection as first param + patternify.`), /*#__PURE__*/ _react1.mdx("h3", null, `rootNotes(octave = 2)`), /*#__PURE__*/ _react1.mdx("p", null, `Turns chord symbols into root notes of chords in given octave.`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
|
tune: `"<C^7 A7b13 Dm7 G7>".m.rootNotes(3)`,
|
||||||
|
mdxType: "MiniRepl"
|
||||||
|
}), /*#__PURE__*/ _react1.mdx("p", null, `Together with edit, groove and voicings, this can be used to create a basic backing track:`), /*#__PURE__*/ _react1.mdx(_miniReplDefault.default, {
|
||||||
|
tune: `"<C^7 A7b13 Dm7 G7>".m.edit(
|
||||||
|
x => x.voicings(['d3','g4']).groove('~ x'.m),
|
||||||
|
x => x.rootNotes(2).tone(synth(osc('sawtooth4')).chain(out))
|
||||||
|
)`,
|
||||||
|
height: 150,
|
||||||
|
mdxType: "MiniRepl"
|
||||||
|
}), /*#__PURE__*/ _react1.mdx("p", null, `TODO: use range instead of octave.
|
||||||
|
TODO: find out why composition does not work`), /*#__PURE__*/ _react1.mdx("h2", null, `MIDI API`), /*#__PURE__*/ _react1.mdx("p", null, `TODO, see `, /*#__PURE__*/ _react1.mdx("a", {
|
||||||
parentName: "p",
|
parentName: "p",
|
||||||
"href": "https://github.com/tidalcycles/strudel/blob/main/repl/src/midi.ts"
|
"href": "https://github.com/tidalcycles/strudel/blob/main/repl/src/midi.ts"
|
||||||
}, `https://github.com/tidalcycles/strudel/blob/main/repl/src/midi.ts`)), /*#__PURE__*/ _react1.mdx("h1", null, `Contributing`), /*#__PURE__*/ _react1.mdx("p", null, `Contributions of any sort are very welcome! You can contribute by editing `, /*#__PURE__*/ _react1.mdx("a", {
|
}, `https://github.com/tidalcycles/strudel/blob/main/repl/src/midi.ts`)), /*#__PURE__*/ _react1.mdx("h1", null, `Contributing`), /*#__PURE__*/ _react1.mdx("p", null, `Contributions of any sort are very welcome! You can contribute by editing `, /*#__PURE__*/ _react1.mdx("a", {
|
||||||
@ -57710,11 +57735,11 @@ Pattern.prototype.voicings = function(range) {
|
|||||||
return _strudelMjs.stack(...lastVoicing);
|
return _strudelMjs.stack(...lastVoicing);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype.chordBass = function() {
|
Pattern.prototype.rootNotes = function(octave = 2) {
|
||||||
|
// range = ['G1', 'C3']
|
||||||
return this._mapNotes((value)=>{
|
return this._mapNotes((value)=>{
|
||||||
console.log('value', value);
|
const [_, root] = value.value.match(/^([a-gA-G])[b#]?.*$/);
|
||||||
const [_, root] = value.value.match(/^([a-gC-G])[b#]?.*$/);
|
const bassNote = root + octave;
|
||||||
const bassNote = root + '2';
|
|
||||||
return {
|
return {
|
||||||
...value,
|
...value,
|
||||||
value: bassNote
|
value: bassNote
|
||||||
@ -57725,9 +57750,9 @@ Pattern.prototype.define('voicings', (range, pat)=>pat.voicings(range)
|
|||||||
, {
|
, {
|
||||||
composable: true
|
composable: true
|
||||||
});
|
});
|
||||||
Pattern.prototype.define('chordBass', (pat)=>{
|
Pattern.prototype.define('rootNotes', (pat)=>{
|
||||||
console.log('call chordBass ...', pat);
|
// console.log('call rootNotes ...', pat);
|
||||||
return pat.chordBass();
|
return pat.rootNotes();
|
||||||
}, {
|
}, {
|
||||||
composable: true
|
composable: true
|
||||||
});
|
});
|
||||||
@ -62353,14 +62378,16 @@ function intervalDirection(from, to, direction = 1) {
|
|||||||
return (sign < 0 ? '-' : '') + interval;
|
return (sign < 0 ? '-' : '') + interval;
|
||||||
}
|
}
|
||||||
// transpose note inside scale by offset steps
|
// transpose note inside scale by offset steps
|
||||||
function scaleTranspose(scale, offset, note) {
|
function scaleTranspose(scale, offset, note1) {
|
||||||
let [tonic, scaleName] = _tonal.Scale.tokenize(scale);
|
let [tonic, scaleName] = _tonal.Scale.tokenize(scale);
|
||||||
const { notes } = _tonal.Scale.get(`${tonic} ${scaleName}`);
|
let { notes } = _tonal.Scale.get(`${tonic} ${scaleName}`);
|
||||||
|
notes = notes.map((note)=>_tonal.Note.get(note).pc
|
||||||
|
); // use only pc!
|
||||||
offset = Number(offset);
|
offset = Number(offset);
|
||||||
if (isNaN(offset)) throw new Error(`scale offset "${offset}" not a number`);
|
if (isNaN(offset)) throw new Error(`scale offset "${offset}" not a number`);
|
||||||
const { pc: fromPc , oct =3 } = _tonal.Note.get(note);
|
const { pc: fromPc , oct =3 } = _tonal.Note.get(note1);
|
||||||
const noteIndex = notes.indexOf(fromPc);
|
const noteIndex = notes.indexOf(fromPc);
|
||||||
if (noteIndex === -1) throw new Error(`note "${note}" is not in scale "${scale}"`);
|
if (noteIndex === -1) throw new Error(`note "${note1}" is not in scale "${scale}"`);
|
||||||
let i = noteIndex, o = oct, n = fromPc;
|
let i = noteIndex, o = oct, n = fromPc;
|
||||||
const direction = Math.sign(offset);
|
const direction = Math.sign(offset);
|
||||||
// TODO: find way to do this smarter
|
// TODO: find way to do this smarter
|
||||||
@ -62407,11 +62434,20 @@ Pattern.prototype._scaleTranspose = function(offset) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype._scale = function(scale) {
|
Pattern.prototype._scale = function(scale) {
|
||||||
return this._mapNotes((value)=>({
|
return this._mapNotes((value)=>{
|
||||||
|
let note = value.value;
|
||||||
|
const asNumber = Number(note);
|
||||||
|
if (!isNaN(asNumber)) {
|
||||||
|
let [tonic, scaleName] = _tonal.Scale.tokenize(scale);
|
||||||
|
const { pc , oct =3 } = _tonal.Note.get(tonic);
|
||||||
|
note = scaleTranspose(pc + ' ' + scaleName, asNumber, pc + oct);
|
||||||
|
}
|
||||||
|
return {
|
||||||
...value,
|
...value,
|
||||||
|
value: note,
|
||||||
scale
|
scale
|
||||||
})
|
};
|
||||||
);
|
});
|
||||||
};
|
};
|
||||||
Pattern.prototype.define('transpose', (a, pat)=>pat.transpose(a)
|
Pattern.prototype.define('transpose', (a, pat)=>pat.transpose(a)
|
||||||
, {
|
, {
|
||||||
@ -108871,4 +108907,4 @@ exports.default = cx;
|
|||||||
|
|
||||||
},{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}]},["3uVTb"], "3uVTb", "parcelRequire94c2")
|
},{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}]},["3uVTb"], "3uVTb", "parcelRequire94c2")
|
||||||
|
|
||||||
//# sourceMappingURL=index.6618aa59.js.map
|
//# sourceMappingURL=index.8b62917f.js.map
|
||||||
File diff suppressed because one or more lines are too long
@ -11,6 +11,6 @@
|
|||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
<script src="/tutorial/index.6618aa59.js" defer=""></script>
|
<script src="/tutorial/index.8b62917f.js" defer=""></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user