From d5938a016c46c20c426d23504eddd908292c3155 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 20 Jun 2022 20:55:20 +0200 Subject: [PATCH] fix looping fonts --- packages/soundfonts/fontloader.mjs | 53 ++++++++++++++------------ packages/soundfonts/package.json | 3 -- packages/webaudio/webaudio.mjs | 13 ++++--- repl/src/tunes.mjs | 61 ++++++++++++++++++++++++++++++ repl/src/tunes.snapshot.mjs | 1 + 5 files changed, 97 insertions(+), 34 deletions(-) diff --git a/packages/soundfonts/fontloader.mjs b/packages/soundfonts/fontloader.mjs index 09841780..953c2695 100644 --- a/packages/soundfonts/fontloader.mjs +++ b/packages/soundfonts/fontloader.mjs @@ -15,11 +15,35 @@ async function loadFont(name) { return loadCache[name]; } -let bufferCache = {}; export async function getFontBufferSource(name, pitch, ac) { + const { buffer, zone } = await getFontPitch(name, pitch, ac); + const src = ac.createBufferSource(); + src.buffer = buffer; + const baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune; + const playbackRate = 1.0 * Math.pow(2, (100.0 * pitch - baseDetune) / 1200.0); + // src detune? + src.playbackRate.value = playbackRate; + const loop = zone.loopStart > 1 && zone.loopStart < zone.loopEnd; + if (!loop) { + /* const waveDuration = duration + this.afterTime; + if (waveDuration > zone.buffer.duration / playbackRate) { + waveDuration = zone.buffer.duration / playbackRate; + // TODO: do sth with waveduration + } */ + } else { + src.loop = true; + src.loopStart = zone.loopStart / zone.sampleRate; + src.loopEnd = zone.loopEnd / zone.sampleRate; + //+ (zone.delay ? zone.delay : 0); + } + return src; +} + +let bufferCache = {}; +export async function getFontPitch(name, pitch, ac) { const key = `${name}:::${pitch}`; if (bufferCache[key]) { - return (await bufferCache[key])(); + return bufferCache[key]; } // console.log('load buffer', key); const load = async () => { @@ -35,31 +59,10 @@ export async function getFontBufferSource(name, pitch, ac) { if (!buffer) { throw new Error(`no soundfont buffer found for preset ${name}, pitch: ${pitch}`); } - return () => { - const src = ac.createBufferSource(); - src.buffer = buffer; - const baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune; - const playbackRate = 1.0 * Math.pow(2, (100.0 * pitch - baseDetune) / 1200.0); - // src detune? - src.playbackRate.value = playbackRate; - const loop = zone.loopStart > 1 && zone.loopStart < zone.loopEnd; - if (!loop) { - /* const waveDuration = duration + this.afterTime; - if (waveDuration > zone.buffer.duration / playbackRate) { - waveDuration = zone.buffer.duration / playbackRate; - // TODO: do sth with waveduration - } */ - } else { - src.loop = true; - /* src.loopStart = zone.loopStart / zone.sampleRate + (zone.delay ? zone.delay : 0); - src.loopEnd = zone.loopEnd / zone.sampleRate + (zone.delay ? zone.delay : 0); */ - } - - return src; - }; + return { buffer, zone }; }; bufferCache[key] = load(); // dont await here to cache promise immediately! - return (await bufferCache[key])(); + return bufferCache[key]; } function findZone(preset, pitch) { diff --git a/packages/soundfonts/package.json b/packages/soundfonts/package.json index bf4f7527..33c032ac 100644 --- a/packages/soundfonts/package.json +++ b/packages/soundfonts/package.json @@ -3,9 +3,6 @@ "version": "0.1.0", "description": "Soundsfont support for strudel", "main": "index.mjs", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, "type": "module", "repository": { "type": "git", diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index bdd38bbc..fea9df25 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -63,10 +63,9 @@ const getSoundfontKey = (s) => { const name = nameIndex < 10 ? `00${nameIndex}` : nameIndex < 100 ? `0${nameIndex}` : nameIndex; if (nameIndex !== -1) { // TODO: indices of instrumentNames do not seem to match instruments - s = globalThis.soundfontList.instruments.find((instrument) => instrument.startsWith(name)); - // console.log('match', nameIndex, s); + return globalThis.soundfontList.instruments.find((instrument) => instrument.startsWith(name)); } - return globalThis.soundfontList?.instruments?.[nameIndex]; + return; }; const getSampleBufferSource = async (s, n) => { @@ -169,15 +168,17 @@ Pattern.prototype.out = function () { console.warn('no buffer source'); return; } - // bufferSource.playbackRate.value = Math.abs(speed) * playbackRate; bufferSource.playbackRate.value = Math.abs(speed) * bufferSource.playbackRate.value; // TODO: nudge, unit, cut, loop - let duration = soundfont ? hap.duration : bufferSource.buffer.duration; // let duration = bufferSource.buffer.duration; const offset = begin * duration; duration = ((end - begin) * duration) / Math.abs(speed); - bufferSource.start(t, offset, duration); + if (soundfont) { + bufferSource.start(t, offset); // duration does not work here for some reason + } else { + bufferSource.start(t, offset, duration); + } bufferSource.stop(t + duration); chain.push(bufferSource); if (soundfont) { diff --git a/repl/src/tunes.mjs b/repl/src/tunes.mjs index 6bfa3b84..60663078 100644 --- a/repl/src/tunes.mjs +++ b/repl/src/tunes.mjs @@ -906,3 +906,64 @@ stack( ) .out() .slow(3/2)`; + +export const swimmingWithSoundfonts = `stack( + n( + "~", + "~", + "~", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [F5@2 C6] A5 G5", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [Bb5 A5 G5] F5@2", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [F5@2 C6] A5 G5", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [Bb5 A5 G5] F5@2", + "A5 [F5@2 C5] A5 F5", + "Ab5 [F5@2 Ab5] G5@2", + "A5 [F5@2 C5] A5 F5", + "Ab5 [F5@2 C5] C6@2", + "A5 [F5@2 C5] [D5@2 F5] F5", + "[C5@2 F5] [Bb5 A5 G5] F5@2" + ).s('Sitar: Ethnic'), + n( + "[F4,Bb4,D5] [[D4,G4,Bb4]@2 [Bb3,D4,F4]] [[G3,C4,E4]@2 [[Ab3,F4] [A3,Gb4]]] [Bb3,E4,G4]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, Bb3, Db3] [F3, Bb3, Db3]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]", + "[~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [A3, C4, E4] [A3, C4, E4]] [~ [Ab3, C4, Eb4] [Ab3, C4, Eb4]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [G3, C4, E4] [G3, C4, E4]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]", + "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]", + "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]", + "[~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [Bb3, D3, F4] [Bb3, D3, F4]] [~ [A3, C4, F4] [A3, C4, F4]] [~ [A3, C4, F4] [A3, C4, F4]]", + "[~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [Ab3, B3, F4] [Ab3, B3, F4]] [~ [G3, Bb3, F4] [G3, Bb3, F4]] [~ [G3, Bb3, E4] [G3, Bb3, E4]]", + "[~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, A3, C3] [F3, A3, C3]] [~ [F3, Bb3, D3] [F3, Bb3, D3]] [~ [F3, B3, D3] [F3, B3, D3]]", + "[~ [F3, Bb3, D4] [F3, Bb3, D4]] [~ [F3, Bb3, C4] [F3, Bb3, C4]] [~ [F3, A3, C4] [F3, A3, C4]] [~ [F3, A3, C4] [F3, A3, C4]]" + ).s('Kalimba: Ethnic'), + n( + "[G3 G3 C3 E3]", + "[F2 D2 G2 C2]", + "[F2 D2 G2 C2]", + "[F2 A2 Bb2 B2]", + "[A2 Ab2 G2 C2]", + "[F2 A2 Bb2 B2]", + "[G2 C2 F2 F2]", + "[F2 A2 Bb2 B2]", + "[A2 Ab2 G2 C2]", + "[F2 A2 Bb2 B2]", + "[G2 C2 F2 F2]", + "[Bb2 Bb2 A2 A2]", + "[Ab2 Ab2 G2 [C2 D2 E2]]", + "[Bb2 Bb2 A2 A2]", + "[Ab2 Ab2 G2 [C2 D2 E2]]", + "[F2 A2 Bb2 B2]", + "[G2 C2 F2 F2]" + ).s('Acoustic Bass: Bass') + ).slow(51) + .out()`; diff --git a/repl/src/tunes.snapshot.mjs b/repl/src/tunes.snapshot.mjs index ec5a9e98..e4c309fb 100644 --- a/repl/src/tunes.snapshot.mjs +++ b/repl/src/tunes.snapshot.mjs @@ -16,6 +16,7 @@ export const sowhatelse = ["-1666666666666667/7500000000000000 -> 2/9: G3","0/1 export const speakerman = ["-18/5 -> 2/5: c3","-18/5 -> 2/5: e3","-18/5 -> 2/5: g3","2/5 -> 12/5: g3","2/5 -> 12/5: bb3","2/5 -> 12/5: d4","0/1 -> 4/1: Baker man","2/5 -> 12/5: g3","2/5 -> 12/5: bb3","2/5 -> 12/5: d4","0/1 -> 4/1: Baker man","2/5 -> 12/5: g3","2/5 -> 12/5: bb3","2/5 -> 12/5: d4","12/5 -> 22/5: f3","12/5 -> 22/5: a3","12/5 -> 22/5: c4","0/1 -> 4/1: Baker man","12/5 -> 22/5: f3","12/5 -> 22/5: a3","12/5 -> 22/5: c4","0/1 -> 4/1: Baker man","12/5 -> 22/5: f3","12/5 -> 22/5: a3","12/5 -> 22/5: c4","22/5 -> 42/5: c3","22/5 -> 42/5: e3","22/5 -> 42/5: g3","4/1 -> 8/1: is baking bread","22/5 -> 42/5: c3","22/5 -> 42/5: e3","22/5 -> 42/5: g3","4/1 -> 8/1: is baking bread","22/5 -> 42/5: c3","22/5 -> 42/5: e3","22/5 -> 42/5: g3","4/1 -> 8/1: is baking bread","22/5 -> 42/5: c3","22/5 -> 42/5: e3","22/5 -> 42/5: g3","4/1 -> 8/1: is baking bread","22/5 -> 42/5: c3","22/5 -> 42/5: e3","22/5 -> 42/5: g3","42/5 -> 52/5: g3","42/5 -> 52/5: bb3","42/5 -> 52/5: d4","8/1 -> 12/1: Baker man","42/5 -> 52/5: g3","42/5 -> 52/5: bb3","42/5 -> 52/5: d4","8/1 -> 12/1: Baker man","42/5 -> 52/5: g3","42/5 -> 52/5: bb3","42/5 -> 52/5: d4","52/5 -> 62/5: f3","52/5 -> 62/5: a3","52/5 -> 62/5: c4","8/1 -> 12/1: Baker man","52/5 -> 62/5: f3","52/5 -> 62/5: a3","52/5 -> 62/5: c4","8/1 -> 12/1: Baker man","52/5 -> 62/5: f3","52/5 -> 62/5: a3","52/5 -> 62/5: c4","62/5 -> 82/5: c3","62/5 -> 82/5: e3","62/5 -> 82/5: g3","12/1 -> 16/1: is baking bread","62/5 -> 82/5: c3","62/5 -> 82/5: e3","62/5 -> 82/5: g3","12/1 -> 16/1: is baking bread","62/5 -> 82/5: c3","62/5 -> 82/5: e3","62/5 -> 82/5: g3","12/1 -> 16/1: is baking bread","62/5 -> 82/5: c3","62/5 -> 82/5: e3","62/5 -> 82/5: g3","12/1 -> 16/1: is baking bread","62/5 -> 82/5: c3","62/5 -> 82/5: e3","62/5 -> 82/5: g3","82/5 -> 92/5: g3","82/5 -> 92/5: bb3","82/5 -> 92/5: d4","16/1 -> 20/1: Sagabona","82/5 -> 92/5: g3","82/5 -> 92/5: bb3","82/5 -> 92/5: d4","16/1 -> 20/1: Sagabona","82/5 -> 92/5: g3","82/5 -> 92/5: bb3","82/5 -> 92/5: d4","92/5 -> 102/5: f3","92/5 -> 102/5: a3","92/5 -> 102/5: c4","16/1 -> 20/1: Sagabona","92/5 -> 102/5: f3","92/5 -> 102/5: a3","92/5 -> 102/5: c4","16/1 -> 20/1: Sagabona","92/5 -> 102/5: f3","92/5 -> 102/5: a3","92/5 -> 102/5: c4","102/5 -> 122/5: c3","102/5 -> 122/5: e3","102/5 -> 122/5: g3","20/1 -> 24/1: kunjani wena","102/5 -> 122/5: c3","102/5 -> 122/5: e3","102/5 -> 122/5: g3","20/1 -> 24/1: kunjani wena","102/5 -> 122/5: c3","102/5 -> 122/5: e3","102/5 -> 122/5: g3","20/1 -> 24/1: kunjani wena","102/5 -> 122/5: c3","102/5 -> 122/5: e3","102/5 -> 122/5: g3","20/1 -> 24/1: kunjani wena","102/5 -> 122/5: c3","102/5 -> 122/5: e3","102/5 -> 122/5: g3","122/5 -> 132/5: g3","122/5 -> 132/5: bb3","122/5 -> 132/5: d4","24/1 -> 28/1: Sagabona","122/5 -> 132/5: g3","122/5 -> 132/5: bb3","122/5 -> 132/5: d4","24/1 -> 28/1: Sagabona","122/5 -> 132/5: g3","122/5 -> 132/5: bb3","122/5 -> 132/5: d4","132/5 -> 142/5: f3","132/5 -> 142/5: a3","132/5 -> 142/5: c4","24/1 -> 28/1: Sagabona","132/5 -> 142/5: f3","132/5 -> 142/5: a3","132/5 -> 142/5: c4","24/1 -> 28/1: Sagabona","132/5 -> 142/5: f3","132/5 -> 142/5: a3","132/5 -> 142/5: c4","142/5 -> 162/5: c3","142/5 -> 162/5: e3","142/5 -> 162/5: g3","28/1 -> 32/1: kunjani wena","142/5 -> 162/5: c3","142/5 -> 162/5: e3","142/5 -> 162/5: g3","28/1 -> 32/1: kunjani wena","142/5 -> 162/5: c3","142/5 -> 162/5: e3","142/5 -> 162/5: g3","28/1 -> 32/1: kunjani wena","142/5 -> 162/5: c3","142/5 -> 162/5: e3","142/5 -> 162/5: g3","28/1 -> 32/1: kunjani wena","142/5 -> 162/5: c3","142/5 -> 162/5: e3","142/5 -> 162/5: g3","162/5 -> 172/5: g3","162/5 -> 172/5: bb3","162/5 -> 172/5: d4","32/1 -> 36/1: The night train, is coming","162/5 -> 172/5: g3","162/5 -> 172/5: bb3","162/5 -> 172/5: d4","32/1 -> 36/1: The night train, is coming","162/5 -> 172/5: g3","162/5 -> 172/5: bb3","162/5 -> 172/5: d4","172/5 -> 182/5: f3","172/5 -> 182/5: a3","172/5 -> 182/5: c4","32/1 -> 36/1: The night train, is coming","172/5 -> 182/5: f3","172/5 -> 182/5: a3","172/5 -> 182/5: c4","32/1 -> 36/1: The night train, is coming","172/5 -> 182/5: f3","172/5 -> 182/5: a3","172/5 -> 182/5: c4","182/5 -> 202/5: c3","182/5 -> 202/5: e3","182/5 -> 202/5: g3","36/1 -> 40/1: got to keep on running","182/5 -> 202/5: c3","182/5 -> 202/5: e3","182/5 -> 202/5: g3","36/1 -> 40/1: got to keep on running","182/5 -> 202/5: c3","182/5 -> 202/5: e3","182/5 -> 202/5: g3","36/1 -> 40/1: got to keep on running","182/5 -> 202/5: c3","182/5 -> 202/5: e3","182/5 -> 202/5: g3","36/1 -> 40/1: got to keep on running","182/5 -> 202/5: c3","182/5 -> 202/5: e3","182/5 -> 202/5: g3","202/5 -> 212/5: g3","202/5 -> 212/5: bb3","202/5 -> 212/5: d4","40/1 -> 44/1: The night train, is coming","202/5 -> 212/5: g3","202/5 -> 212/5: bb3","202/5 -> 212/5: d4","40/1 -> 44/1: The night train, is coming","202/5 -> 212/5: g3","202/5 -> 212/5: bb3","202/5 -> 212/5: d4","212/5 -> 222/5: f3","212/5 -> 222/5: a3","212/5 -> 222/5: c4","40/1 -> 44/1: The night train, is coming","212/5 -> 222/5: f3","212/5 -> 222/5: a3","212/5 -> 222/5: c4","40/1 -> 44/1: The night train, is coming","212/5 -> 222/5: f3","212/5 -> 222/5: a3","212/5 -> 222/5: c4","222/5 -> 242/5: c3","222/5 -> 242/5: e3","222/5 -> 242/5: g3","44/1 -> 48/1: got to keep on running","222/5 -> 242/5: c3","222/5 -> 242/5: e3","222/5 -> 242/5: g3","44/1 -> 48/1: got to keep on running","222/5 -> 242/5: c3","222/5 -> 242/5: e3","222/5 -> 242/5: g3","44/1 -> 48/1: got to keep on running","222/5 -> 242/5: c3","222/5 -> 242/5: e3","222/5 -> 242/5: g3","44/1 -> 48/1: got to keep on running"] export const struct = ["0/1 -> 1/2: c2","1/2 -> 1/1: g2","0/1 -> 1/3: B3","0/1 -> 1/3: D4","0/1 -> 1/3: E4","0/1 -> 1/3: G4","1/3 -> 1/2: B3","1/3 -> 1/2: D4","1/3 -> 1/2: E4","1/3 -> 1/2: G4","5/6 -> 1/1: B3","5/6 -> 1/1: D4","5/6 -> 1/1: E4","5/6 -> 1/1: G4","1/1 -> 3/2: a2","3/2 -> 11/6: e2","11/6 -> 2/1: eb2","4/3 -> 2/1: G3","4/3 -> 2/1: B3","4/3 -> 2/1: C#4","4/3 -> 2/1: F#4","2/1 -> 5/2: d2","5/2 -> 3/1: a2","2/1 -> 13/6: C4","2/1 -> 13/6: E4","2/1 -> 13/6: F4","2/1 -> 13/6: A4","3/1 -> 7/2: g2","7/2 -> 11/3: d2","23/6 -> 4/1: db2","10/3 -> 4/1: B3","10/3 -> 4/1: E4","10/3 -> 4/1: F4","10/3 -> 4/1: A4"] export const swimming = ["0/1 -> 3/4: F4","0/1 -> 3/4: Bb4","0/1 -> 3/4: D5","3/4 -> 5/4: D4","3/4 -> 5/4: G4","3/4 -> 5/4: Bb4","0/1 -> 3/4: G3","3/4 -> 3/2: G3","3/4 -> 5/4: D4","3/4 -> 5/4: G4","3/4 -> 5/4: Bb4","5/4 -> 3/2: Bb3","5/4 -> 3/2: D4","5/4 -> 3/2: F4","3/2 -> 2/1: G3","3/2 -> 2/1: C4","3/2 -> 2/1: E4","3/4 -> 3/2: G3","3/2 -> 9/4: C3","2/1 -> 17/8: Ab3","2/1 -> 17/8: F4","17/8 -> 9/4: A3","17/8 -> 9/4: Gb4","9/4 -> 3/1: Bb3","9/4 -> 3/1: E4","9/4 -> 3/1: G4","3/2 -> 9/4: C3","9/4 -> 3/1: E3","13/4 -> 7/2: F3","13/4 -> 7/2: A3","13/4 -> 7/2: C3","7/2 -> 15/4: F3","7/2 -> 15/4: A3","7/2 -> 15/4: C3","3/1 -> 15/4: F2","15/4 -> 9/2: D2","4/1 -> 17/4: F3","4/1 -> 17/4: A3","4/1 -> 17/4: C3","17/4 -> 9/2: F3","17/4 -> 9/2: A3","17/4 -> 9/2: C3","19/4 -> 5/1: F3","19/4 -> 5/1: Bb3","19/4 -> 5/1: D3","15/4 -> 9/2: D2","9/2 -> 21/4: G2","5/1 -> 21/4: F3","5/1 -> 21/4: Bb3","5/1 -> 21/4: D3","11/2 -> 23/4: F3","11/2 -> 23/4: Bb3","11/2 -> 23/4: Db3","23/4 -> 6/1: F3","23/4 -> 6/1: Bb3","23/4 -> 6/1: Db3","9/2 -> 21/4: G2","21/4 -> 6/1: C2","25/4 -> 13/2: F3","25/4 -> 13/2: A3","25/4 -> 13/2: C3","13/2 -> 27/4: F3","13/2 -> 27/4: A3","13/2 -> 27/4: C3","6/1 -> 27/4: F2","27/4 -> 15/2: D2","7/1 -> 29/4: F3","7/1 -> 29/4: A3","7/1 -> 29/4: C3","29/4 -> 15/2: F3","29/4 -> 15/2: A3","29/4 -> 15/2: C3","31/4 -> 8/1: F3","31/4 -> 8/1: Bb3","31/4 -> 8/1: D3","27/4 -> 15/2: D2","15/2 -> 33/4: G2","8/1 -> 33/4: F3","8/1 -> 33/4: Bb3","8/1 -> 33/4: D3","17/2 -> 35/4: F3","17/2 -> 35/4: B3","17/2 -> 35/4: D3","35/4 -> 9/1: F3","35/4 -> 9/1: B3","35/4 -> 9/1: D3","15/2 -> 33/4: G2","33/4 -> 9/1: C2","9/1 -> 39/4: A5","39/4 -> 41/4: F5","37/4 -> 19/2: F3","37/4 -> 19/2: A3","37/4 -> 19/2: C3","19/2 -> 39/4: F3","19/2 -> 39/4: A3","19/2 -> 39/4: C3","9/1 -> 39/4: F2","39/4 -> 21/2: A2","39/4 -> 41/4: F5","41/4 -> 21/2: C5","21/2 -> 11/1: D5","10/1 -> 41/4: F3","10/1 -> 41/4: A3","10/1 -> 41/4: C3","41/4 -> 21/2: F3","41/4 -> 21/2: A3","41/4 -> 21/2: C3","43/4 -> 11/1: F3","43/4 -> 11/1: Bb3","43/4 -> 11/1: D3","39/4 -> 21/2: A2","21/2 -> 45/4: Bb2","11/1 -> 45/4: F5","45/4 -> 12/1: F5","11/1 -> 45/4: F3","11/1 -> 45/4: Bb3","11/1 -> 45/4: D3","23/2 -> 47/4: F3","23/2 -> 47/4: B3","23/2 -> 47/4: D3","47/4 -> 12/1: F3","47/4 -> 12/1: B3","47/4 -> 12/1: D3","21/2 -> 45/4: Bb2","45/4 -> 12/1: B2","12/1 -> 25/2: C5","25/2 -> 51/4: F5","51/4 -> 53/4: F5","49/4 -> 25/2: A3","49/4 -> 25/2: C4","49/4 -> 25/2: E4","25/2 -> 51/4: A3","25/2 -> 51/4: C4","25/2 -> 51/4: E4","12/1 -> 51/4: A2","51/4 -> 27/2: Ab2","51/4 -> 53/4: F5","53/4 -> 27/2: C6","27/2 -> 57/4: A5","13/1 -> 53/4: Ab3","13/1 -> 53/4: C4","13/1 -> 53/4: Eb4","53/4 -> 27/2: Ab3","53/4 -> 27/2: C4","53/4 -> 27/2: Eb4","55/4 -> 14/1: F3","55/4 -> 14/1: Bb3","55/4 -> 14/1: D3","51/4 -> 27/2: Ab2","27/2 -> 57/4: G2","27/2 -> 57/4: A5","57/4 -> 15/1: G5","14/1 -> 57/4: F3","14/1 -> 57/4: Bb3","14/1 -> 57/4: D3","29/2 -> 59/4: G3","29/2 -> 59/4: C4","29/2 -> 59/4: E4","59/4 -> 15/1: G3","59/4 -> 15/1: C4","59/4 -> 15/1: E4","27/2 -> 57/4: G2","57/4 -> 15/1: C2","15/1 -> 63/4: A5","63/4 -> 65/4: F5","61/4 -> 31/2: F3","61/4 -> 31/2: A3","61/4 -> 31/2: C4","31/2 -> 63/4: F3","31/2 -> 63/4: A3","31/2 -> 63/4: C4","15/1 -> 63/4: F2","63/4 -> 33/2: A2","63/4 -> 65/4: F5","65/4 -> 33/2: C5","33/2 -> 17/1: D5","16/1 -> 65/4: F3","16/1 -> 65/4: A3","16/1 -> 65/4: C4","65/4 -> 33/2: F3","65/4 -> 33/2: A3","65/4 -> 33/2: C4","67/4 -> 17/1: F3","67/4 -> 17/1: Bb3","67/4 -> 17/1: D3","63/4 -> 33/2: A2","33/2 -> 69/4: Bb2","17/1 -> 69/4: F5","69/4 -> 18/1: F5","17/1 -> 69/4: F3","17/1 -> 69/4: Bb3","17/1 -> 69/4: D3","35/2 -> 71/4: F3","35/2 -> 71/4: B3","35/2 -> 71/4: D3","71/4 -> 18/1: F3","71/4 -> 18/1: B3","71/4 -> 18/1: D3","33/2 -> 69/4: Bb2","69/4 -> 18/1: B2","18/1 -> 37/2: C5","37/2 -> 75/4: F5","75/4 -> 19/1: Bb5","73/4 -> 37/2: F3","73/4 -> 37/2: Bb3","73/4 -> 37/2: D4","37/2 -> 75/4: F3","37/2 -> 75/4: Bb3","37/2 -> 75/4: D4","18/1 -> 75/4: G2","75/4 -> 39/2: C2","19/1 -> 77/4: A5","77/4 -> 39/2: G5","39/2 -> 21/1: F5","19/1 -> 77/4: F3","19/1 -> 77/4: Bb3","19/1 -> 77/4: C4","77/4 -> 39/2: F3","77/4 -> 39/2: Bb3","77/4 -> 39/2: C4","79/4 -> 20/1: F3","79/4 -> 20/1: A3","79/4 -> 20/1: C4","75/4 -> 39/2: C2","39/2 -> 81/4: F2","39/2 -> 21/1: F5","20/1 -> 81/4: F3","20/1 -> 81/4: A3","20/1 -> 81/4: C4","41/2 -> 83/4: F3","41/2 -> 83/4: A3","41/2 -> 83/4: C4","83/4 -> 21/1: F3","83/4 -> 21/1: A3","83/4 -> 21/1: C4","39/2 -> 81/4: F2","81/4 -> 21/1: F2","21/1 -> 87/4: A5","87/4 -> 89/4: F5","85/4 -> 43/2: F3","85/4 -> 43/2: A3","85/4 -> 43/2: C3","43/2 -> 87/4: F3","43/2 -> 87/4: A3","43/2 -> 87/4: C3","21/1 -> 87/4: F2","87/4 -> 45/2: A2","87/4 -> 89/4: F5","89/4 -> 45/2: C5","45/2 -> 23/1: D5","22/1 -> 89/4: F3","22/1 -> 89/4: A3","22/1 -> 89/4: C3","89/4 -> 45/2: F3","89/4 -> 45/2: A3","89/4 -> 45/2: C3","91/4 -> 23/1: F3","91/4 -> 23/1: Bb3","91/4 -> 23/1: D3","87/4 -> 45/2: A2","45/2 -> 93/4: Bb2","23/1 -> 93/4: F5","93/4 -> 24/1: F5","23/1 -> 93/4: F3","23/1 -> 93/4: Bb3","23/1 -> 93/4: D3","47/2 -> 95/4: F3","47/2 -> 95/4: B3","47/2 -> 95/4: D3","95/4 -> 24/1: F3","95/4 -> 24/1: B3","95/4 -> 24/1: D3","45/2 -> 93/4: Bb2","93/4 -> 24/1: B2","24/1 -> 49/2: C5","49/2 -> 99/4: F5","99/4 -> 101/4: F5","97/4 -> 49/2: A3","97/4 -> 49/2: C4","97/4 -> 49/2: E4","49/2 -> 99/4: A3","49/2 -> 99/4: C4","49/2 -> 99/4: E4","24/1 -> 99/4: A2","99/4 -> 51/2: Ab2","99/4 -> 101/4: F5","101/4 -> 51/2: C6","51/2 -> 105/4: A5","25/1 -> 101/4: Ab3","25/1 -> 101/4: C4","25/1 -> 101/4: Eb4","101/4 -> 51/2: Ab3","101/4 -> 51/2: C4","101/4 -> 51/2: Eb4","103/4 -> 26/1: F3","103/4 -> 26/1: Bb3","103/4 -> 26/1: D3","99/4 -> 51/2: Ab2","51/2 -> 105/4: G2","51/2 -> 105/4: A5","105/4 -> 27/1: G5","26/1 -> 105/4: F3","26/1 -> 105/4: Bb3","26/1 -> 105/4: D3","53/2 -> 107/4: G3","53/2 -> 107/4: C4","53/2 -> 107/4: E4","107/4 -> 27/1: G3","107/4 -> 27/1: C4","107/4 -> 27/1: E4","51/2 -> 105/4: G2","105/4 -> 27/1: C2","27/1 -> 111/4: A5","111/4 -> 113/4: F5","109/4 -> 55/2: F3","109/4 -> 55/2: A3","109/4 -> 55/2: C3","55/2 -> 111/4: F3","55/2 -> 111/4: A3","55/2 -> 111/4: C3","27/1 -> 111/4: F2","111/4 -> 57/2: A2","111/4 -> 113/4: F5","113/4 -> 57/2: C5","57/2 -> 29/1: D5","28/1 -> 113/4: F3","28/1 -> 113/4: A3","28/1 -> 113/4: C3","113/4 -> 57/2: F3","113/4 -> 57/2: A3","113/4 -> 57/2: C3","115/4 -> 29/1: F3","115/4 -> 29/1: Bb3","115/4 -> 29/1: D3","111/4 -> 57/2: A2","57/2 -> 117/4: Bb2","29/1 -> 117/4: F5","117/4 -> 30/1: F5","29/1 -> 117/4: F3","29/1 -> 117/4: Bb3","29/1 -> 117/4: D3","59/2 -> 119/4: F3","59/2 -> 119/4: B3","59/2 -> 119/4: D3","119/4 -> 30/1: F3","119/4 -> 30/1: B3","119/4 -> 30/1: D3","57/2 -> 117/4: Bb2","117/4 -> 30/1: B2","30/1 -> 61/2: C5","61/2 -> 123/4: F5","123/4 -> 31/1: Bb5","121/4 -> 61/2: F3","121/4 -> 61/2: Bb3","121/4 -> 61/2: D4","61/2 -> 123/4: F3","61/2 -> 123/4: Bb3","61/2 -> 123/4: D4","30/1 -> 123/4: G2","123/4 -> 63/2: C2","31/1 -> 125/4: A5","125/4 -> 63/2: G5","63/2 -> 33/1: F5","31/1 -> 125/4: F3","31/1 -> 125/4: Bb3","31/1 -> 125/4: C4","125/4 -> 63/2: F3","125/4 -> 63/2: Bb3","125/4 -> 63/2: C4","127/4 -> 32/1: F3","127/4 -> 32/1: A3","127/4 -> 32/1: C4","123/4 -> 63/2: C2","63/2 -> 129/4: F2","63/2 -> 33/1: F5","32/1 -> 129/4: F3","32/1 -> 129/4: A3","32/1 -> 129/4: C4","65/2 -> 131/4: F3","65/2 -> 131/4: A3","65/2 -> 131/4: C4","131/4 -> 33/1: F3","131/4 -> 33/1: A3","131/4 -> 33/1: C4","63/2 -> 129/4: F2","129/4 -> 33/1: F2","33/1 -> 135/4: A5","135/4 -> 137/4: F5","133/4 -> 67/2: Bb3","133/4 -> 67/2: D3","133/4 -> 67/2: F4","67/2 -> 135/4: Bb3","67/2 -> 135/4: D3","67/2 -> 135/4: F4","33/1 -> 135/4: Bb2","135/4 -> 69/2: Bb2","135/4 -> 137/4: F5","137/4 -> 69/2: C5","69/2 -> 141/4: A5","34/1 -> 137/4: Bb3","34/1 -> 137/4: D3","34/1 -> 137/4: F4","137/4 -> 69/2: Bb3","137/4 -> 69/2: D3","137/4 -> 69/2: F4","139/4 -> 35/1: A3","139/4 -> 35/1: C4","139/4 -> 35/1: F4","135/4 -> 69/2: Bb2","69/2 -> 141/4: A2","69/2 -> 141/4: A5","141/4 -> 36/1: F5","35/1 -> 141/4: A3","35/1 -> 141/4: C4","35/1 -> 141/4: F4","71/2 -> 143/4: A3","71/2 -> 143/4: C4","71/2 -> 143/4: F4","143/4 -> 36/1: A3","143/4 -> 36/1: C4","143/4 -> 36/1: F4","69/2 -> 141/4: A2","141/4 -> 36/1: A2","36/1 -> 147/4: Ab5","147/4 -> 149/4: F5","145/4 -> 73/2: Ab3","145/4 -> 73/2: B3","145/4 -> 73/2: F4","73/2 -> 147/4: Ab3","73/2 -> 147/4: B3","73/2 -> 147/4: F4","36/1 -> 147/4: Ab2","147/4 -> 75/2: Ab2","147/4 -> 149/4: F5","149/4 -> 75/2: Ab5","75/2 -> 39/1: G5","37/1 -> 149/4: Ab3","37/1 -> 149/4: B3","37/1 -> 149/4: F4","149/4 -> 75/2: Ab3","149/4 -> 75/2: B3","149/4 -> 75/2: F4","151/4 -> 38/1: G3","151/4 -> 38/1: Bb3","151/4 -> 38/1: F4","147/4 -> 75/2: Ab2","75/2 -> 153/4: G2","75/2 -> 39/1: G5","38/1 -> 153/4: G3","38/1 -> 153/4: Bb3","38/1 -> 153/4: F4","77/2 -> 155/4: G3","77/2 -> 155/4: Bb3","77/2 -> 155/4: E4","155/4 -> 39/1: G3","155/4 -> 39/1: Bb3","155/4 -> 39/1: E4","75/2 -> 153/4: G2","153/4 -> 77/2: C2","77/2 -> 155/4: D2","155/4 -> 39/1: E2","39/1 -> 159/4: A5","159/4 -> 161/4: F5","157/4 -> 79/2: Bb3","157/4 -> 79/2: D3","157/4 -> 79/2: F4","79/2 -> 159/4: Bb3","79/2 -> 159/4: D3","79/2 -> 159/4: F4","39/1 -> 159/4: Bb2","159/4 -> 81/2: Bb2","159/4 -> 161/4: F5","161/4 -> 81/2: C5","81/2 -> 165/4: A5","40/1 -> 161/4: Bb3","40/1 -> 161/4: D3","40/1 -> 161/4: F4","161/4 -> 81/2: Bb3","161/4 -> 81/2: D3","161/4 -> 81/2: F4","163/4 -> 41/1: A3","163/4 -> 41/1: C4","163/4 -> 41/1: F4","159/4 -> 81/2: Bb2","81/2 -> 165/4: A2","81/2 -> 165/4: A5","165/4 -> 42/1: F5","41/1 -> 165/4: A3","41/1 -> 165/4: C4","41/1 -> 165/4: F4","83/2 -> 167/4: A3","83/2 -> 167/4: C4","83/2 -> 167/4: F4","167/4 -> 42/1: A3","167/4 -> 42/1: C4","167/4 -> 42/1: F4","81/2 -> 165/4: A2","165/4 -> 42/1: A2","42/1 -> 171/4: Ab5","171/4 -> 173/4: F5","169/4 -> 85/2: Ab3","169/4 -> 85/2: B3","169/4 -> 85/2: F4","85/2 -> 171/4: Ab3","85/2 -> 171/4: B3","85/2 -> 171/4: F4","42/1 -> 171/4: Ab2","171/4 -> 87/2: Ab2","171/4 -> 173/4: F5","173/4 -> 87/2: C5","87/2 -> 45/1: C6","43/1 -> 173/4: Ab3","43/1 -> 173/4: B3","43/1 -> 173/4: F4","173/4 -> 87/2: Ab3","173/4 -> 87/2: B3","173/4 -> 87/2: F4","175/4 -> 44/1: G3","175/4 -> 44/1: Bb3","175/4 -> 44/1: F4","171/4 -> 87/2: Ab2","87/2 -> 177/4: G2","87/2 -> 45/1: C6","44/1 -> 177/4: G3","44/1 -> 177/4: Bb3","44/1 -> 177/4: F4","89/2 -> 179/4: G3","89/2 -> 179/4: Bb3","89/2 -> 179/4: E4","179/4 -> 45/1: G3","179/4 -> 45/1: Bb3","179/4 -> 45/1: E4","87/2 -> 177/4: G2","177/4 -> 89/2: C2","89/2 -> 179/4: D2","179/4 -> 45/1: E2","45/1 -> 183/4: A5","183/4 -> 185/4: F5","181/4 -> 91/2: F3","181/4 -> 91/2: A3","181/4 -> 91/2: C3","91/2 -> 183/4: F3","91/2 -> 183/4: A3","91/2 -> 183/4: C3","45/1 -> 183/4: F2","183/4 -> 93/2: A2","183/4 -> 185/4: F5","185/4 -> 93/2: C5","93/2 -> 47/1: D5","46/1 -> 185/4: F3","46/1 -> 185/4: A3","46/1 -> 185/4: C3","185/4 -> 93/2: F3","185/4 -> 93/2: A3","185/4 -> 93/2: C3","187/4 -> 47/1: F3","187/4 -> 47/1: Bb3","187/4 -> 47/1: D3","183/4 -> 93/2: A2","93/2 -> 189/4: Bb2","47/1 -> 189/4: F5","189/4 -> 48/1: F5","47/1 -> 189/4: F3","47/1 -> 189/4: Bb3","47/1 -> 189/4: D3","95/2 -> 191/4: F3","95/2 -> 191/4: B3","95/2 -> 191/4: D3","191/4 -> 48/1: F3","191/4 -> 48/1: B3","191/4 -> 48/1: D3","93/2 -> 189/4: Bb2","189/4 -> 48/1: B2","48/1 -> 97/2: C5","97/2 -> 195/4: F5","195/4 -> 49/1: Bb5","193/4 -> 97/2: F3","193/4 -> 97/2: Bb3","193/4 -> 97/2: D4","97/2 -> 195/4: F3","97/2 -> 195/4: Bb3","97/2 -> 195/4: D4","48/1 -> 195/4: G2","195/4 -> 99/2: C2","49/1 -> 197/4: A5","197/4 -> 99/2: G5","99/2 -> 51/1: F5","49/1 -> 197/4: F3","49/1 -> 197/4: Bb3","49/1 -> 197/4: C4","197/4 -> 99/2: F3","197/4 -> 99/2: Bb3","197/4 -> 99/2: C4","199/4 -> 50/1: F3","199/4 -> 50/1: A3","199/4 -> 50/1: C4","195/4 -> 99/2: C2","99/2 -> 201/4: F2","99/2 -> 51/1: F5","50/1 -> 201/4: F3","50/1 -> 201/4: A3","50/1 -> 201/4: C4","101/2 -> 203/4: F3","101/2 -> 203/4: A3","101/2 -> 203/4: C4","203/4 -> 51/1: F3","203/4 -> 51/1: A3","203/4 -> 51/1: C4","99/2 -> 201/4: F2","201/4 -> 51/1: F2"] +export const swimmingWithSoundfonts = ["0/1 -> 3/4: {\"n\":\"F4\",\"s\":\"Kalimba: Ethnic\"}","0/1 -> 3/4: {\"n\":\"Bb4\",\"s\":\"Kalimba: Ethnic\"}","0/1 -> 3/4: {\"n\":\"D5\",\"s\":\"Kalimba: Ethnic\"}","3/4 -> 5/4: {\"n\":\"D4\",\"s\":\"Kalimba: Ethnic\"}","3/4 -> 5/4: {\"n\":\"G4\",\"s\":\"Kalimba: Ethnic\"}","3/4 -> 5/4: {\"n\":\"Bb4\",\"s\":\"Kalimba: Ethnic\"}","0/1 -> 3/4: {\"n\":\"G3\",\"s\":\"Acoustic Bass: Bass\"}","3/4 -> 3/2: {\"n\":\"G3\",\"s\":\"Acoustic Bass: Bass\"}"] export const synthDrums = ["0/1 -> 1/2: c1","1/2 -> 1/1: c1","1/1 -> 3/2: c1","3/2 -> 2/1: c1","2/1 -> 5/2: c1","5/2 -> 3/1: c1","3/1 -> 7/2: c1","7/2 -> 4/1: c1","1/2 -> 1/1: c3","3/2 -> 2/1: c3","5/2 -> 3/1: c3","7/2 -> 4/1: c3","0/1 -> 1/4: C1","1/4 -> 1/2: C3","1/2 -> 3/4: C1","3/4 -> 1/1: C3","1/1 -> 5/4: C1","5/4 -> 3/2: C3","3/2 -> 7/4: C1","7/4 -> 2/1: C3","2/1 -> 9/4: C1","9/4 -> 5/2: C3","5/2 -> 11/4: C1","11/4 -> 3/1: C3","3/1 -> 13/4: C1","13/4 -> 7/2: C3","7/2 -> 15/4: C1","15/4 -> 4/1: C3"] export const technoDrums = ["0/1 -> 1/2: c1","1/2 -> 1/1: c1","1/1 -> 3/2: c1","3/2 -> 2/1: c1","2/1 -> 5/2: c1","5/2 -> 3/1: c1","3/1 -> 7/2: c1","7/2 -> 4/1: c1","1/2 -> 1/1: x","3/2 -> 2/1: x","5/2 -> 3/1: x","7/2 -> 4/1: x","1/4 -> 1/2: c4","3/4 -> 1/1: c4","5/4 -> 3/2: c4","7/4 -> 2/1: c4","9/4 -> 5/2: c4","11/4 -> 3/1: c4","13/4 -> 7/2: c4","15/4 -> 4/1: c4"] export const tetrisMini = ["0/1 -> 1/2: e5","1/2 -> 3/4: b4","3/4 -> 1/1: c5","0/1 -> 1/4: e2","1/4 -> 1/2: e3","1/2 -> 3/4: e2","3/4 -> 1/1: e3","1/1 -> 3/2: d5","3/2 -> 7/4: c5","7/4 -> 2/1: b4","1/1 -> 5/4: e2","5/4 -> 3/2: e3","3/2 -> 7/4: e2","7/4 -> 2/1: e3","2/1 -> 5/2: a4","5/2 -> 11/4: a4","11/4 -> 3/1: c5","2/1 -> 9/4: a2","9/4 -> 5/2: a3","5/2 -> 11/4: a2","11/4 -> 3/1: a3","3/1 -> 7/2: e5","7/2 -> 15/4: d5","15/4 -> 4/1: c5","3/1 -> 13/4: a2","13/4 -> 7/2: a3","7/2 -> 15/4: a2","15/4 -> 4/1: a3","4/1 -> 9/2: b4","19/4 -> 5/1: c5","4/1 -> 17/4: g#2","17/4 -> 9/2: g#3","9/2 -> 19/4: g#2","19/4 -> 5/1: g#3","5/1 -> 11/2: d5","11/2 -> 6/1: e5","5/1 -> 21/4: e2","21/4 -> 11/2: e3","11/2 -> 23/4: e2","23/4 -> 6/1: e3","6/1 -> 13/2: c5","13/2 -> 7/1: a4","6/1 -> 25/4: a2","25/4 -> 13/2: a3","13/2 -> 27/4: a2","27/4 -> 7/1: a3","7/1 -> 15/2: a4","7/1 -> 29/4: a2","29/4 -> 15/2: a3","15/2 -> 31/4: b1","31/4 -> 8/1: c2","33/4 -> 17/2: d5","35/4 -> 9/1: f5","8/1 -> 33/4: d2","33/4 -> 17/2: d3","17/2 -> 35/4: d2","35/4 -> 9/1: d3","9/1 -> 19/2: a5","19/2 -> 39/4: g5","39/4 -> 10/1: f5","9/1 -> 37/4: d2","37/4 -> 19/2: d3","19/2 -> 39/4: d2","39/4 -> 10/1: d3","10/1 -> 21/2: e5","43/4 -> 11/1: c5","10/1 -> 41/4: c2","41/4 -> 21/2: c3","21/2 -> 43/4: c2","43/4 -> 11/1: c3","11/1 -> 23/2: e5","23/2 -> 47/4: d5","47/4 -> 12/1: c5","11/1 -> 45/4: c2","45/4 -> 23/2: c3","23/2 -> 47/4: c2","47/4 -> 12/1: c3","12/1 -> 25/2: b4","25/2 -> 51/4: b4","51/4 -> 13/1: c5","12/1 -> 49/4: b1","49/4 -> 25/2: b2","25/2 -> 51/4: b1","51/4 -> 13/1: b2","13/1 -> 27/2: d5","27/2 -> 14/1: e5","13/1 -> 53/4: e2","53/4 -> 27/2: e3","27/2 -> 55/4: e2","55/4 -> 14/1: e3","14/1 -> 29/2: c5","29/2 -> 15/1: a4","14/1 -> 57/4: a1","57/4 -> 29/2: a2","29/2 -> 59/4: a1","59/4 -> 15/1: a2","15/1 -> 31/2: a4","15/1 -> 61/4: a1","61/4 -> 31/2: a2","31/2 -> 63/4: a1","63/4 -> 16/1: a2"]