From b167f209358f454417a2ecdd916540818dd9b3fa Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 9 May 2025 20:02:20 +0900 Subject: [PATCH] randomised music generator for test item --- .../modulecomputers/NetFrameWatchdog.kt | 2 +- .../gameactors/FixtureMechanicalTines.kt | 31 +- .../gameactors/MusikalischesWuerfelspiel.kt | 350 ++++++++++++++++++ 3 files changed, 377 insertions(+), 6 deletions(-) create mode 100644 src/net/torvald/terrarum/modulebasegame/gameactors/MusikalischesWuerfelspiel.kt diff --git a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/NetFrameWatchdog.kt b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/NetFrameWatchdog.kt index 1e5e3fc8f..7f6ae0163 100644 --- a/ModuleComputers/src/net/torvald/terrarum/modulecomputers/NetFrameWatchdog.kt +++ b/ModuleComputers/src/net/torvald/terrarum/modulecomputers/NetFrameWatchdog.kt @@ -10,7 +10,7 @@ import net.torvald.terrarum.modulebasegame.gameworld.NetRunner */ class NetFrameWatchdog : TerrarumWorldWatchdog(App.TICK_SPEED * 60) { override fun invoke(world: GameWorld) { - (world.extraFields["tokenring"] as NetRunner).let { + (world.extraFields["tokenring"] as? NetRunner)?.let { it.purgeDeadFrames() } } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMechanicalTines.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMechanicalTines.kt index aa84df81d..875bace32 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMechanicalTines.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMechanicalTines.kt @@ -62,20 +62,41 @@ class FixtureMechanicalTines : Electric { } } - @Transient private var testRollCursor = 0 + @Transient private var pianoRollCursor = 0 + + @Transient private val pianoRoll = ArrayList() override fun updateSignal() { // TODO update using network port if (isSignalHigh(0, 1)) { + if (pianoRoll.isEmpty()) + fillUsingDicePlay() + // advance every tick - testNotes[testRollCursor].let { - audioBank.sendMessage(it) - spewParticles(it) + if (pianoRollCursor in pianoRoll.indices) { + pianoRoll[pianoRollCursor].let { + audioBank.sendMessage(it) + spewParticles(it) + } + pianoRollCursor++ + } + else { + // start infinite loop + pianoRoll.clear() + fillUsingDicePlay() } - testRollCursor = (testRollCursor + 1) % testNotes.size } + else { + pianoRoll.clear() + pianoRollCursor = 0 + } + } + + private fun fillUsingDicePlay() { + pianoRoll.addAll(MusikalischesWuerfelspiel.generateRoll()) + pianoRollCursor = 0 } private fun spewParticles(noteBits: Long) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/MusikalischesWuerfelspiel.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/MusikalischesWuerfelspiel.kt new file mode 100644 index 000000000..193fd0224 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/MusikalischesWuerfelspiel.kt @@ -0,0 +1,350 @@ +package net.torvald.terrarum.modulebasegame.gameactors + +import net.torvald.terrarum.modulebasegame.gameactors.PreludeInCMaj.toPianoRoll + +/** + * Implementation of Musikalisches Würfelspiel by W. A. Mozart + * + * Created by minjaesong on 2025-05-07. + */ +object MusikalischesWuerfelspiel { + + val NIL = 0L + // Octave 1 + val C1 = 1L shl 0 + val Cs1 = 1L shl 1 + val Db1 = 1L shl 1 + val D1 = 1L shl 2 + val Ds1 = 1L shl 3 + val Eb1 = 1L shl 3 + val E1 = 1L shl 4 + val F1 = 1L shl 5 + val Fs1 = 1L shl 6 + val Gb1 = 1L shl 6 + val G1 = 1L shl 7 + val Gs1 = 1L shl 8 + val Ab1 = 1L shl 8 + val A1 = 1L shl 9 + val As1 = 1L shl 10 + val Bb1 = 1L shl 10 + val B1 = 1L shl 11 + // Octave 2 + val C2 = 1L shl 12 + val Cs2 = 1L shl 13 + val Db2 = 1L shl 13 + val D2 = 1L shl 14 + val Ds2 = 1L shl 15 + val Eb2 = 1L shl 15 + val E2 = 1L shl 16 + val F2 = 1L shl 17 + val Fs2 = 1L shl 18 + val Gb2 = 1L shl 18 + val G2 = 1L shl 19 + val Gs2 = 1L shl 20 + val Ab2 = 1L shl 20 + val A2 = 1L shl 21 + val As2 = 1L shl 22 + val Bb2 = 1L shl 22 + val B2 = 1L shl 23 + // Octave 3 + val C3 = 1L shl 24 + val Cs3 = 1L shl 25 + val Db3 = 1L shl 25 + val D3 = 1L shl 26 + val Ds3 = 1L shl 27 + val Eb3 = 1L shl 27 + val E3 = 1L shl 28 + val F3 = 1L shl 29 + val Fs3 = 1L shl 30 + val Gb3 = 1L shl 30 + val G3 = 1L shl 31 + val Gs3 = 1L shl 32 + val Ab3 = 1L shl 32 + val A3 = 1L shl 33 + val As3 = 1L shl 34 + val Bb3 = 1L shl 34 + val B3 = 1L shl 35 + // Octave 4 + val C4 = 1L shl 36 + val Cs4 = 1L shl 37 + val Db4 = 1L shl 37 + val D4 = 1L shl 38 + val Ds4 = 1L shl 39 + val Eb4 = 1L shl 39 + val E4 = 1L shl 40 + val F4 = 1L shl 41 + val Fs4 = 1L shl 42 + val Gb4 = 1L shl 42 + val G4 = 1L shl 43 + val Gs4 = 1L shl 44 + val Ab4 = 1L shl 44 + val A4 = 1L shl 45 + val As4 = 1L shl 46 + val Bb4 = 1L shl 46 + val B4 = 1L shl 47 + // Octave 5 + val C5 = 1L shl 48 + val Cs5 = 1L shl 49 + val Db5 = 1L shl 49 + val D5 = 1L shl 50 + val Ds5 = 1L shl 51 + val Eb5 = 1L shl 51 + val E5 = 1L shl 52 + val F5 = 1L shl 53 + val Fs5 = 1L shl 54 + val Gb5 = 1L shl 54 + val G5 = 1L shl 55 + val Gs5 = 1L shl 56 + val Ab5 = 1L shl 56 + val A5 = 1L shl 57 + val As5 = 1L shl 58 + val Bb5 = 1L shl 58 + val B5 = 1L shl 59 + // Octave 6 + val C6 = 1L shl 60 + + private val TICK_DIVISOR = 10 + + private val diceTable = arrayOf( + intArrayOf(96,32,69,40,148,104,152,119,98,3,54), + intArrayOf(22,6,95,17,74,157,60,84,142,87,130), + intArrayOf(141,128,158,113,163,27,171,114,42,165,10), + intArrayOf(41,63,13,85,45,167,53,50,156,61,103), + intArrayOf(105,146,153,161,80,154,99,140,75,135,28), + intArrayOf(122,46,55,2,97,68,133,86,129,47,37), + intArrayOf(11,134,110,159,36,118,21,169,62,147,106), + intArrayOf(30,81,24,100,107,91,127,94,123,33,5), + intArrayOf(70,117,66,90,25,138,16,120,65,102,35), + intArrayOf(121,39,139,176,143,71,155,88,77,4,20), + intArrayOf(26,126,15,7,64,150,57,48,19,31,108), + intArrayOf(9,56,132,34,125,29,175,166,82,164,92), + intArrayOf(122,174,73,67,76,101,43,51,137,144,12), + intArrayOf(49,18,58,160,136,162,168,115,38,59,124), + intArrayOf(109,116,145,52,1,23,89,72,149,173,44), + intArrayOf(14,83,79,170,93,151,172,111,8,78,131), + ) + + fun generateRoll(): List { + val ret = ArrayList() + + for (i in 0 until 16) { + val roll = (Math.random() * 11).toInt() + ret.addAll(BARS[diceTable[i][roll]]) + } + + return ret + } + + // original idea by W. A. Mozart (https://dice.humdrum.org/) + // "creative" transcription generated using Claude 3.7 Sonnet + private val BARS = arrayOf( + /* Bar 00 */ sixSemiquavers(NIL, NIL, NIL, NIL, NIL, NIL), + /* Bar 01 */ sixSemiquavers(G2 or F4, NIL, D2 or D4, NIL, G2 or G4, NIL), + /* Bar 02 */ sixSemiquavers(B1 or G2 or A3, NIL, Fs3, G3, B3, G4), + /* Bar 03 */ sixSemiquavers(C2 or E1 or G4, NIL, C4, NIL, E4, NIL), + /* Bar 04 */ sixSemiquavers(C2 or G2 or B3, NIL, G3, A3, B3, D4), + /* Bar 05 */ sixSemiquavers(D2 or Fs2 or D4, NIL, A3, NIL, D4, NIL), + /* Bar 06 */ sixSemiquavers(D2 or A2 or Fs4, NIL, D4, E4, Fs4, A4), + /* Bar 07 */ sixSemiquavers(G2 or B4, NIL, D4, NIL, G4, NIL), + /* Bar 08 */ sixSemiquavers(G1 or G2 or B3, NIL, D3, NIL, G3, NIL), + /* Bar 09 */ sixSemiquavers(C2 or E4, NIL, G3, G4, E4, C4), + /* Bar 10 */ sixSemiquavers(G1 or B1 or G3, NIL, D3, NIL, G3, NIL), + /* Bar 11 */ sixSemiquavers(A1 or C2 or A3, NIL, E3, A3, C4, E4), + /* Bar 12 */ sixSemiquavers(D1 or D2 or Fs4, NIL, A3, D4, Fs4, A4), + /* Bar 13 */ sixSemiquavers(G1 or G3, A3, B3, G3, D4, B3), + /* Bar 14 */ sixSemiquavers(C2 or C4, B3, A3, G3, Fs3, E3), + /* Bar 15 */ sixSemiquavers(D2 or Fs3, G3, A3, B3, C4, D4), + /* Bar 16 */ sixSemiquavers(G1 or B1 or D4, B3, A3, G3, A3, B3), + /* Bar 17 */ sixSemiquavers(C2 or C4, D4, E4, C4, G4, E4), + /* Bar 18 */ sixSemiquavers(G1 or G4, F4, Eb4, D4, C4, B3), + /* Bar 19 */ sixSemiquavers(C2 or C4, D4, Eb4, C4, G3, Eb3), + /* Bar 20 */ sixSemiquavers(G1 or G3, F3, Eb3, D3, C3, B2), + /* Bar 21 */ sixSemiquavers(C2 or C3, D3, Eb3, F3, G3, A3), + /* Bar 22 */ sixSemiquavers(G1 or B3, C4, D4, G3, B3, G3), + /* Bar 23 */ sixSemiquavers(C3 or E3 or C4, D4, E4, G3, C4, G3), + /* Bar 24 */ sixSemiquavers(G2 or B2 or G3, D3, G3, B3, G3, D3), + /* Bar 25 */ sixSemiquavers(C3 or Eb3 or C4, NIL, G3, NIL, Eb4, NIL), + /* Bar 26 */ sixSemiquavers(Fs3 or A3 or C4, NIL, D3, NIL, C4, NIL), + /* Bar 27 */ sixSemiquavers(G2 or D3 or B3, NIL, G3, NIL, D4, NIL), + /* Bar 28 */ sixSemiquavers(G1 or B2 or G3, NIL, D3, NIL, G3, NIL), + /* Bar 29 */ sixSemiquavers(C2 or E4, NIL, G3, G4, E4, C4), + /* Bar 30 */ sixSemiquavers(G1 or B1 or G3, NIL, D3, NIL, G3, NIL), + /* Bar 31 */ sixSemiquavers(A1 or C2 or A3, NIL, E3, A3, C4, E4), + /* Bar 32 */ sixSemiquavers(D1 or D2 or Fs4, NIL, A3, D4, Fs4, A4), + /* Bar 33 */ sixSemiquavers(G1 or G3, A3, B3, G3, D4, B3), + /* Bar 34 */ sixSemiquavers(C2 or C4, B3, A3, G3, Fs3, E3), + /* Bar 35 */ sixSemiquavers(D2 or Fs3, G3, A3, B3, C4, D4), + /* Bar 36 */ sixSemiquavers(G1 or B1 or D4, B3, A3, G3, Fs3, G3), + /* Bar 37 */ sixSemiquavers(C2 or E3, G3, C4, E4, G4, C5), + /* Bar 38 */ sixSemiquavers(G1 or B1 or D5, NIL, B4, G4, D4, B3), + /* Bar 39 */ sixSemiquavers(C2 or E3, G3, C4, E4, G4, C5), + /* Bar 40 */ sixSemiquavers(G1 or B1 or D5, NIL, B4, G4, D4, B3), + /* Bar 41 */ sixSemiquavers(A1 or C2 or E3, A3, C4, E4, A4, C5), + /* Bar 42 */ sixSemiquavers(E2 or G2 or E5, NIL, B4, G4, E4, B3), + /* Bar 43 */ sixSemiquavers(A1 or A2 or C5, NIL, A4, E4, C4, A3), + /* Bar 44 */ sixSemiquavers(D2 or Fs2 or A4, NIL, Fs4, D4, A3, Fs3), + /* Bar 45 */ sixSemiquavers(G1 or G2 or B3, D4, G4, B4, G4, D4), + /* Bar 46 */ sixSemiquavers(G1 or B1 or G4, F4, E4, D4, C4, B3), + /* Bar 47 */ sixSemiquavers(C2 or C4, D4, E4, G4, C5, G4), + /* Bar 48 */ sixSemiquavers(G1 or B1 or F4, D4, B3, G3, D3, B2), + /* Bar 49 */ restPattern(G2 or B2 or G3, G2 or G3, B1 or B2), + /* Bar 50 */ restPattern(C2 or C3, C2 or C3, D2 or D3), + /* Bar 51 */ restPattern(D2 or D3, D2 or D3, D1 or D2), + /* Bar 52 */ restPattern(G1 or G2, G1 or G2, G1 or G2), + /* Bar 53 */ sixSemiquavers(G2 or G4, NIL, D4, NIL, B3, NIL), + /* Bar 54 */ sixSemiquavers(C2 or C4, NIL, G3, NIL, E3, NIL), + /* Bar 55 */ sixSemiquavers(D2 or D4, NIL, A3, NIL, Fs3, NIL), + /* Bar 56 */ sixSemiquavers(G1 or G3, NIL, D3, NIL, B2, NIL), + /* Bar 57 */ sixSemiquavers(G2 or G4, NIL, D4, NIL, B3, NIL), + /* Bar 58 */ sixSemiquavers(C2 or C4, NIL, G3, NIL, E3, NIL), + /* Bar 59 */ sixSemiquavers(D2 or D4, NIL, A3, NIL, Fs3, NIL), + /* Bar 60 */ sixSemiquavers(G1 or G3, NIL, D3, NIL, B2, NIL), + /* Bar 61 */ sixSemiquavers(C3 or C4, D4, E4, G3, C4, E4), + /* Bar 62 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 63 */ sixSemiquavers(C3 or C4, D4, E4, G3, C4, E4), + /* Bar 64 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 65 */ sixSemiquavers(C3 or C4, G3, E4, C4, G4, E4), + /* Bar 66 */ sixSemiquavers(G2 or G3, D3, B3, G3, D4, B3), + /* Bar 67 */ sixSemiquavers(C3 or C4, G3, E4, C4, G4, E4), + /* Bar 68 */ sixSemiquavers(G2 or G3, D3, B3, G3, D4, B3), + /* Bar 69 */ sixSemiquavers(A1 or C4, A3, E4, C4, A4, E4), + /* Bar 70 */ sixSemiquavers(E2 or B3, G3, E4, B3, G4, E4), + /* Bar 71 */ sixSemiquavers(A1 or C4, A3, E4, C4, A4, E4), + /* Bar 72 */ sixSemiquavers(D2 or A3, Fs3, D4, A3, Fs4, D4), + /* Bar 73 */ sixSemiquavers(G1 or B3, G3, D4, B3, G4, D4), + /* Bar 74 */ sixSemiquavers(G1 or G3, D3, B3, G3, D4, B3), + /* Bar 75 */ sixSemiquavers(C2 or C4, G3, E4, C4, G4, E4), + /* Bar 76 */ sixSemiquavers(G1 or D3, B2, G3, D3, B3, G3), + /* Bar 77 */ sixSemiquavers(C2 or E3, G3, C4, E3, G3, C4), + /* Bar 78 */ sixSemiquavers(G1 or D3, G3, B3, D3, G3, B3), + /* Bar 79 */ restPattern(C2 or C3, C2 or C3, D2 or D3), + /* Bar 80 */ restPattern(D2 or D3, D2 or D3, D1 or D2), + /* Bar 81 */ sixSemiquavers(G2 or G4, NIL, D4, NIL, B3, NIL), + /* Bar 82 */ sixSemiquavers(C2 or C4, NIL, G3, NIL, E3, NIL), + /* Bar 83 */ sixSemiquavers(D2 or D4, NIL, A3, NIL, Fs3, NIL), + /* Bar 84 */ sixSemiquavers(G1 or G3, NIL, D3, NIL, B2, NIL), + /* Bar 85 */ sixSemiquavers(C3 or C4, D4, E4, G3, C4, E4), + /* Bar 86 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 87 */ sixSemiquavers(A2 or A3, B3, C4, E3, A3, C4), + /* Bar 88 */ sixSemiquavers(D2 or D3, E3, Fs3, A2, D3, Fs3), + /* Bar 89 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 90 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 91 */ sixSemiquavers(C3 or C4, B3, C4, G3, E3, C3), + /* Bar 92 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 93 */ sixSemiquavers(C3 or C4, B3, C4, G3, E3, C3), + /* Bar 94 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 95 */ sixSemiquavers(C3 or C4, B3, C4, G3, E3, C3), + /* Bar 96 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 97 */ sixSemiquavers(C3 or C4, B3, C4, E3, G3, C4), + /* Bar 98 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 99 */ restPattern(C2 or C3, G2 or C3, C3 or E3), + /* Bar 100 */ restPattern(G1 or G2, G2 or B2, G2 or D3), + /* Bar 101 */ restPattern(G2 or G3, G2 or B3, G2 or D4), + /* Bar 102 */ restPattern(C2 or C4, C2 or E4, C2 or G4), + /* Bar 103 */ restPattern(D2 or A4, D2 or D4, D2 or Fs4), + /* Bar 104 */ restPattern(G1 or G4, G1 or B3, G1 or D4), + /* Bar 105 */ sixSemiquavers(G2 or G4, NIL, D4, NIL, B3, NIL), + /* Bar 106 */ sixSemiquavers(C2 or C4, NIL, G3, NIL, E3, NIL), + /* Bar 107 */ sixSemiquavers(D2 or D4, NIL, A3, NIL, Fs3, NIL), + /* Bar 108 */ sixSemiquavers(G1 or G3, NIL, D3, NIL, B2, NIL), + /* Bar 109 */ sixSemiquavers(G2 or G4, NIL, D4, NIL, B3, NIL), + /* Bar 110 */ sixSemiquavers(C2 or C4, NIL, G3, NIL, E3, NIL), + /* Bar 111 */ sixSemiquavers(D2 or D4, NIL, A3, NIL, Fs3, NIL), + /* Bar 112 */ sixSemiquavers(G1 or G3, NIL, D3, NIL, B2, NIL), + /* Bar 113 */ sixSemiquavers(C3 or C4, D4, E4, G3, C4, E4), + /* Bar 114 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 115 */ sixSemiquavers(C3 or C4, D4, E4, G3, C4, E4), + /* Bar 116 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 117 */ sixSemiquavers(C3 or C4, G3, E4, C4, G4, E4), + /* Bar 118 */ sixSemiquavers(G2 or G3, D3, B3, G3, D4, B3), + /* Bar 119 */ sixSemiquavers(C3 or C4, G3, E4, C4, G4, E4), + /* Bar 120 */ sixSemiquavers(G2 or G3, D3, B3, G3, D4, B3), + /* Bar 121 */ sixSemiquavers(A1 or C4, A3, E4, C4, A4, E4), + /* Bar 122 */ sixSemiquavers(E2 or B3, G3, E4, B3, G4, E4), + /* Bar 123 */ sixSemiquavers(A1 or C4, A3, E4, C4, A4, E4), + /* Bar 124 */ sixSemiquavers(D2 or A3, Fs3, D4, A3, Fs4, D4), + /* Bar 125 */ sixSemiquavers(G1 or B3, G3, D4, B3, G4, D4), + /* Bar 126 */ sixSemiquavers(G1 or G3, D3, B3, G3, D4, B3), + /* Bar 127 */ sixSemiquavers(C2 or C4, G3, E4, C4, G4, E4), + /* Bar 128 */ sixSemiquavers(G1 or D3, B2, G3, D3, B3, G3), + /* Bar 129 */ sixSemiquavers(C2 or E3, G3, C4, E3, G3, C4), + /* Bar 130 */ sixSemiquavers(G1 or D3, G3, B3, D3, G3, B3), + /* Bar 131 */ restPattern(C2 or C3, C2 or C3, D2 or D3), + /* Bar 132 */ restPattern(D2 or D3, D2 or D3, D1 or D2), + /* Bar 133 */ sixSemiquavers(G2 or G4, NIL, D4, NIL, B3, NIL), + /* Bar 134 */ sixSemiquavers(C2 or C4, NIL, G3, NIL, E3, NIL), + /* Bar 135 */ sixSemiquavers(D2 or D4, NIL, A3, NIL, Fs3, NIL), + /* Bar 136 */ sixSemiquavers(G1 or G3, NIL, D3, NIL, B2, NIL), + /* Bar 137 */ sixSemiquavers(C3 or C4, D4, E4, G3, C4, E4), + /* Bar 138 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 139 */ sixSemiquavers(A2 or A3, B3, C4, E3, A3, C4), + /* Bar 140 */ sixSemiquavers(D2 or D3, E3, Fs3, A2, D3, Fs3), + /* Bar 141 */ sixSemiquavers(G2 or G3, A3, B3, D3, G3, B3), + /* Bar 142 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 143 */ sixSemiquavers(C3 or C4, B3, C4, G3, E3, C3), + /* Bar 144 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 145 */ sixSemiquavers(C3 or C4, B3, C4, G3, E3, C3), + /* Bar 146 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 147 */ sixSemiquavers(C3 or C4, B3, C4, G3, E3, C3), + /* Bar 148 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 149 */ sixSemiquavers(C3 or C4, B3, C4, E3, G3, C4), + /* Bar 150 */ sixSemiquavers(G2 or G3, Fs3, G3, B2, D3, G3), + /* Bar 151 */ sixSemiquavers(C3 or C4, G3, E4, C4, G4, E4), + /* Bar 152 */ sixSemiquavers(G2 or G3, D3, B3, G3, D4, B3), + /* Bar 153 */ sixSemiquavers(C3 or C4, G3, E4, C4, G4, E4), + /* Bar 154 */ sixSemiquavers(G2 or G3, D3, B3, G3, D4, B3), + /* Bar 155 */ sixSemiquavers(A1 or C4, A3, E4, C4, A4, E4), + /* Bar 156 */ sixSemiquavers(E2 or B3, G3, E4, B3, G4, E4), + /* Bar 157 */ sixSemiquavers(A1 or C4, A3, E4, C4, A4, E4), + /* Bar 158 */ sixSemiquavers(D2 or A3, Fs3, D4, A3, Fs4, D4), + /* Bar 159 */ sixSemiquavers(G1 or B3, G3, D4, B3, G4, D4), + /* Bar 160 */ sixSemiquavers(G1 or G3, D3, B3, G3, D4, B3), + /* Bar 161 */ sixSemiquavers(C2 or C4, G3, E4, C4, G4, E4), + /* Bar 162 */ sixSemiquavers(G1 or D3, B2, G3, D3, B3, G3), + /* Bar 163 */ sixSemiquavers(C2 or E3, G3, C4, E3, G3, C4), + /* Bar 164 */ sixSemiquavers(G1 or D3, G3, B3, D3, G3, B3), + /* Bar 165 */ restPattern(C2 or C3, C2 or C3, D2 or D3), + /* Bar 166 */ restPattern(D2 or D3, D2 or D3, D1 or D2), + /* Bar 167 */ sixSemiquavers(G2 or B2 or G3, NIL, D3, G3, B3, D4), + /* Bar 168 */ sixSemiquavers(C2 or C4, NIL, G3, C4, E4, G4), + /* Bar 169 */ sixSemiquavers(D2 or Fs4, NIL, D4, A3, D4, Fs4), + /* Bar 170 */ sixSemiquavers(G1 or G2 or G4, NIL, D4, B3, G3, D3), + /* Bar 171 */ sixSemiquavers(C2 or C4, D4, E4, G3, C4, E4), + /* Bar 172 */ sixSemiquavers(G1 or G3, A3, B3, D3, G3, B3), + /* Bar 173 */ sixSemiquavers(D2 or D4, E4, Fs4, A3, D4, Fs4), + /* Bar 174 */ sixSemiquavers(G1 or G4, D4, B3, G3, D3, B2), + /* Bar 175 */ sixSemiquavers(C2 or C3, G2, E3, C3, G2, E2), + /* Bar 176 */ sixSemiquavers(G1 or G2, D2, B1, G1, G2, B2), + ) + + private fun sixSemiquavers(ns1: Long, ns2: Long, ns3: Long, ns4: Long, ns5: Long, ns6: Long): List { + return toPianoRoll( + ns1 to TICK_DIVISOR, + ns2 to TICK_DIVISOR, + ns3 to TICK_DIVISOR, + ns4 to TICK_DIVISOR, + ns5 to TICK_DIVISOR, + ns6 to TICK_DIVISOR + ) + } + + private fun fourSemiQuaver(ns1: Long, ns2: Long, ns3: Long, ns4: Long, ns5: Long): List { + return toPianoRoll( + ns1 to TICK_DIVISOR, + ns2 to TICK_DIVISOR, + ns3 to TICK_DIVISOR, + ns4 to TICK_DIVISOR, + ns5 to TICK_DIVISOR * 2 + ) + } + + private fun restPattern(ns1: Long, ns2: Long, ns3: Long): List { + return toPianoRoll( + ns1 to TICK_DIVISOR * 2, + NIL to TICK_DIVISOR, + ns2 to TICK_DIVISOR, + ns3 to TICK_DIVISOR * 2 + ) + } + +} \ No newline at end of file