Upload 4 files
Browse files- app.js +6 -37
- index.html +6 -0
- styles.css +18 -0
- worker.js +141 -13
app.js
CHANGED
|
@@ -122,10 +122,7 @@ const midiStartBarTimeEl = document.querySelector("#midiStartBarTime");
|
|
| 122 |
const midiBpmModeGroup = document.querySelector("#midiBpmModeGroup");
|
| 123 |
const midiBpmModeButtons = midiBpmModeGroup ? midiBpmModeGroup.querySelectorAll(".toggle-btn") : [];
|
| 124 |
|
| 125 |
-
let
|
| 126 |
-
let bachSeedActive = false;
|
| 127 |
-
let bachSymphonyActive = true;
|
| 128 |
-
let bachSymphony2HandActive = false;
|
| 129 |
let midiBpmMode = "lock";
|
| 130 |
let midiTokens = [];
|
| 131 |
let midiStartBar = 0;
|
|
@@ -767,7 +764,7 @@ async function start() {
|
|
| 767 |
queue = [];
|
| 768 |
generatedEvents = 0;
|
| 769 |
visualNotes = [];
|
| 770 |
-
if (tempoEl) tempoEl.textContent =
|
| 771 |
|
| 772 |
setStatus("Warming AI model prompt...", "buffering");
|
| 773 |
|
|
@@ -779,13 +776,10 @@ async function start() {
|
|
| 779 |
temperature: Math.max(0.05, Number(tempInput.value)),
|
| 780 |
topK: Math.max(1, Number(topKInput.value)),
|
| 781 |
bpm: Number(tempoEl.textContent || 120),
|
| 782 |
-
|
| 783 |
-
midiTokens:
|
| 784 |
midiStartBar: midiStartBar,
|
| 785 |
-
midiBpmMode: midiBpmMode
|
| 786 |
-
bachSeedActive: bachSeedActive,
|
| 787 |
-
bachSymphonyActive: bachSymphonyActive,
|
| 788 |
-
bachSymphony2HandActive: bachSymphony2HandActive
|
| 789 |
});
|
| 790 |
});
|
| 791 |
|
|
@@ -1488,36 +1482,11 @@ toggleButtons.forEach(btn => {
|
|
| 1488 |
btn.classList.add("active");
|
| 1489 |
|
| 1490 |
const value = btn.dataset.value;
|
|
|
|
| 1491 |
if (value === "midi") {
|
| 1492 |
-
midiSeedActive = true;
|
| 1493 |
midiSeedControls.style.display = "block";
|
| 1494 |
-
bachSeedActive = false;
|
| 1495 |
-
bachSymphonyActive = false;
|
| 1496 |
-
bachSymphony2HandActive = false;
|
| 1497 |
-
} else if (value === "bach") {
|
| 1498 |
-
midiSeedActive = false;
|
| 1499 |
-
midiSeedControls.style.display = "none";
|
| 1500 |
-
bachSeedActive = true;
|
| 1501 |
-
bachSymphonyActive = false;
|
| 1502 |
-
bachSymphony2HandActive = false;
|
| 1503 |
-
} else if (value === "bach_symphony") {
|
| 1504 |
-
midiSeedActive = false;
|
| 1505 |
-
midiSeedControls.style.display = "none";
|
| 1506 |
-
bachSeedActive = false;
|
| 1507 |
-
bachSymphonyActive = true;
|
| 1508 |
-
bachSymphony2HandActive = false;
|
| 1509 |
-
} else if (value === "bach_symphony_2hand") {
|
| 1510 |
-
midiSeedActive = false;
|
| 1511 |
-
midiSeedControls.style.display = "none";
|
| 1512 |
-
bachSeedActive = false;
|
| 1513 |
-
bachSymphonyActive = false;
|
| 1514 |
-
bachSymphony2HandActive = true;
|
| 1515 |
} else {
|
| 1516 |
-
midiSeedActive = false;
|
| 1517 |
midiSeedControls.style.display = "none";
|
| 1518 |
-
bachSeedActive = false;
|
| 1519 |
-
bachSymphonyActive = false;
|
| 1520 |
-
bachSymphony2HandActive = false;
|
| 1521 |
}
|
| 1522 |
});
|
| 1523 |
});
|
|
|
|
| 122 |
const midiBpmModeGroup = document.querySelector("#midiBpmModeGroup");
|
| 123 |
const midiBpmModeButtons = midiBpmModeGroup ? midiBpmModeGroup.querySelectorAll(".toggle-btn") : [];
|
| 124 |
|
| 125 |
+
let activePlayingStyle = "bach_symphony";
|
|
|
|
|
|
|
|
|
|
| 126 |
let midiBpmMode = "lock";
|
| 127 |
let midiTokens = [];
|
| 128 |
let midiStartBar = 0;
|
|
|
|
| 764 |
queue = [];
|
| 765 |
generatedEvents = 0;
|
| 766 |
visualNotes = [];
|
| 767 |
+
if (tempoEl) tempoEl.textContent = (activePlayingStyle === "midi") ? String(Math.round(midiBpm)) : "120";
|
| 768 |
|
| 769 |
setStatus("Warming AI model prompt...", "buffering");
|
| 770 |
|
|
|
|
| 776 |
temperature: Math.max(0.05, Number(tempInput.value)),
|
| 777 |
topK: Math.max(1, Number(topKInput.value)),
|
| 778 |
bpm: Number(tempoEl.textContent || 120),
|
| 779 |
+
playingStyle: activePlayingStyle,
|
| 780 |
+
midiTokens: (activePlayingStyle === "midi") ? midiTokens : [],
|
| 781 |
midiStartBar: midiStartBar,
|
| 782 |
+
midiBpmMode: midiBpmMode
|
|
|
|
|
|
|
|
|
|
| 783 |
});
|
| 784 |
});
|
| 785 |
|
|
|
|
| 1482 |
btn.classList.add("active");
|
| 1483 |
|
| 1484 |
const value = btn.dataset.value;
|
| 1485 |
+
activePlayingStyle = value;
|
| 1486 |
if (value === "midi") {
|
|
|
|
| 1487 |
midiSeedControls.style.display = "block";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1488 |
} else {
|
|
|
|
| 1489 |
midiSeedControls.style.display = "none";
|
|
|
|
|
|
|
|
|
|
| 1490 |
}
|
| 1491 |
});
|
| 1492 |
});
|
index.html
CHANGED
|
@@ -196,6 +196,12 @@
|
|
| 196 |
<button type="button" class="toggle-btn" data-value="bach">Bach</button>
|
| 197 |
<button type="button" class="toggle-btn active" data-value="bach_symphony">Grand Symphony</button>
|
| 198 |
<button type="button" class="toggle-btn" data-value="bach_symphony_2hand">Grand Symphony (2-Hand)</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 199 |
</div>
|
| 200 |
|
| 201 |
<!-- MIDI Seeding Controls (Expandable if active) -->
|
|
|
|
| 196 |
<button type="button" class="toggle-btn" data-value="bach">Bach</button>
|
| 197 |
<button type="button" class="toggle-btn active" data-value="bach_symphony">Grand Symphony</button>
|
| 198 |
<button type="button" class="toggle-btn" data-value="bach_symphony_2hand">Grand Symphony (2-Hand)</button>
|
| 199 |
+
<button type="button" class="toggle-btn" data-value="mozart">Mozart</button>
|
| 200 |
+
<button type="button" class="toggle-btn" data-value="chopin">Chopin</button>
|
| 201 |
+
<button type="button" class="toggle-btn" data-value="debussy">Debussy</button>
|
| 202 |
+
<button type="button" class="toggle-btn" data-value="beethoven">Beethoven</button>
|
| 203 |
+
<button type="button" class="toggle-btn" data-value="satie">Satie</button>
|
| 204 |
+
<button type="button" class="toggle-btn" data-value="dark">Dark</button>
|
| 205 |
</div>
|
| 206 |
|
| 207 |
<!-- MIDI Seeding Controls (Expandable if active) -->
|
styles.css
CHANGED
|
@@ -368,6 +368,24 @@ body {
|
|
| 368 |
flex-direction: column;
|
| 369 |
gap: 20px;
|
| 370 |
min-width: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 371 |
}
|
| 372 |
|
| 373 |
.info-sidebar {
|
|
|
|
| 368 |
flex-direction: column;
|
| 369 |
gap: 20px;
|
| 370 |
min-width: 0;
|
| 371 |
+
overflow-y: auto;
|
| 372 |
+
max-height: 100%;
|
| 373 |
+
padding-right: 4px;
|
| 374 |
+
}
|
| 375 |
+
|
| 376 |
+
/* Custom Scrollbar for Sidebar Column */
|
| 377 |
+
.sidebar-column::-webkit-scrollbar {
|
| 378 |
+
width: 4px;
|
| 379 |
+
}
|
| 380 |
+
.sidebar-column::-webkit-scrollbar-track {
|
| 381 |
+
background: transparent;
|
| 382 |
+
}
|
| 383 |
+
.sidebar-column::-webkit-scrollbar-thumb {
|
| 384 |
+
background-color: rgba(255, 255, 255, 0.08);
|
| 385 |
+
border-radius: 4px;
|
| 386 |
+
}
|
| 387 |
+
.sidebar-column::-webkit-scrollbar-thumb:hover {
|
| 388 |
+
background-color: rgba(255, 255, 255, 0.15);
|
| 389 |
}
|
| 390 |
|
| 391 |
.info-sidebar {
|
worker.js
CHANGED
|
@@ -27,13 +27,10 @@ let currentBpm = 120;
|
|
| 27 |
let midiBpmMode = "lock";
|
| 28 |
|
| 29 |
// Seeding settings
|
| 30 |
-
let
|
| 31 |
-
let bachSeedActive = false;
|
| 32 |
let midiTokens = [];
|
| 33 |
let midiStartBar = 0;
|
| 34 |
let isWarmingUp = false;
|
| 35 |
-
let bachSymphonyActive = false;
|
| 36 |
-
let bachSymphony2HandActive = false;
|
| 37 |
|
| 38 |
// Temporal queues for gathering parsed events
|
| 39 |
let tempQueue = [];
|
|
@@ -180,7 +177,7 @@ function makeEventParser() {
|
|
| 180 |
if (token.startsWith("BPM_")) {
|
| 181 |
const bpm = Number(token.slice(4));
|
| 182 |
if (Number.isFinite(bpm) && bpm >= 40 && bpm <= 220) {
|
| 183 |
-
if (!
|
| 184 |
currentBpm = bpm;
|
| 185 |
self.postMessage({ action: "tempo", bpm: bpm });
|
| 186 |
}
|
|
@@ -270,9 +267,9 @@ async function warmPrompt() {
|
|
| 270 |
c = zeroState();
|
| 271 |
|
| 272 |
let allTokensStr;
|
| 273 |
-
if (
|
| 274 |
allTokensStr = getTokensUpToBar(midiTokens, midiStartBar);
|
| 275 |
-
} else if (
|
| 276 |
allTokensStr = [
|
| 277 |
"BOS", "BPM_100", "GRID_64",
|
| 278 |
"BAR",
|
|
@@ -285,7 +282,7 @@ async function warmPrompt() {
|
|
| 285 |
"POS_24", "NOTE_74", "DUR_16", "VEL_6",
|
| 286 |
"BAR"
|
| 287 |
];
|
| 288 |
-
} else if (
|
| 289 |
allTokensStr = [
|
| 290 |
"BOS", "BPM_120", "GRID_64",
|
| 291 |
"BAR",
|
|
@@ -336,7 +333,7 @@ async function warmPrompt() {
|
|
| 336 |
"NOTE_74", "DUR_32", "VEL_7",
|
| 337 |
"BAR"
|
| 338 |
];
|
| 339 |
-
} else if (
|
| 340 |
allTokensStr = [
|
| 341 |
"BOS", "BPM_120", "GRID_64",
|
| 342 |
"BAR",
|
|
@@ -413,6 +410,140 @@ async function warmPrompt() {
|
|
| 413 |
"NOTE_74", "DUR_32", "VEL_7",
|
| 414 |
"BAR"
|
| 415 |
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 416 |
} else {
|
| 417 |
allTokensStr = ["BOS", "BPM_120", "GRID_64", "BAR", "POS_0"];
|
| 418 |
}
|
|
@@ -483,13 +614,10 @@ self.onmessage = async function (e) {
|
|
| 483 |
temperature = data.temperature;
|
| 484 |
topK = data.topK;
|
| 485 |
currentBpm = data.bpm;
|
| 486 |
-
|
| 487 |
midiTokens = data.midiTokens;
|
| 488 |
midiStartBar = data.midiStartBar;
|
| 489 |
midiBpmMode = data.midiBpmMode || "lock";
|
| 490 |
-
bachSeedActive = data.bachSeedActive || false;
|
| 491 |
-
bachSymphonyActive = data.bachSymphonyActive || false;
|
| 492 |
-
bachSymphony2HandActive = data.bachSymphony2HandActive || false;
|
| 493 |
|
| 494 |
parser = makeParser();
|
| 495 |
parser.reset();
|
|
|
|
| 27 |
let midiBpmMode = "lock";
|
| 28 |
|
| 29 |
// Seeding settings
|
| 30 |
+
let playingStyle = "default";
|
|
|
|
| 31 |
let midiTokens = [];
|
| 32 |
let midiStartBar = 0;
|
| 33 |
let isWarmingUp = false;
|
|
|
|
|
|
|
| 34 |
|
| 35 |
// Temporal queues for gathering parsed events
|
| 36 |
let tempQueue = [];
|
|
|
|
| 177 |
if (token.startsWith("BPM_")) {
|
| 178 |
const bpm = Number(token.slice(4));
|
| 179 |
if (Number.isFinite(bpm) && bpm >= 40 && bpm <= 220) {
|
| 180 |
+
if (playingStyle !== "midi" || isWarmingUp || midiBpmMode === "model") {
|
| 181 |
currentBpm = bpm;
|
| 182 |
self.postMessage({ action: "tempo", bpm: bpm });
|
| 183 |
}
|
|
|
|
| 267 |
c = zeroState();
|
| 268 |
|
| 269 |
let allTokensStr;
|
| 270 |
+
if (playingStyle === "midi" && midiTokens.length > 0) {
|
| 271 |
allTokensStr = getTokensUpToBar(midiTokens, midiStartBar);
|
| 272 |
+
} else if (playingStyle === "bach") {
|
| 273 |
allTokensStr = [
|
| 274 |
"BOS", "BPM_100", "GRID_64",
|
| 275 |
"BAR",
|
|
|
|
| 282 |
"POS_24", "NOTE_74", "DUR_16", "VEL_6",
|
| 283 |
"BAR"
|
| 284 |
];
|
| 285 |
+
} else if (playingStyle === "bach_symphony") {
|
| 286 |
allTokensStr = [
|
| 287 |
"BOS", "BPM_120", "GRID_64",
|
| 288 |
"BAR",
|
|
|
|
| 333 |
"NOTE_74", "DUR_32", "VEL_7",
|
| 334 |
"BAR"
|
| 335 |
];
|
| 336 |
+
} else if (playingStyle === "bach_symphony_2hand") {
|
| 337 |
allTokensStr = [
|
| 338 |
"BOS", "BPM_120", "GRID_64",
|
| 339 |
"BAR",
|
|
|
|
| 410 |
"NOTE_74", "DUR_32", "VEL_7",
|
| 411 |
"BAR"
|
| 412 |
];
|
| 413 |
+
} else if (playingStyle === "mozart") {
|
| 414 |
+
allTokensStr = [
|
| 415 |
+
"BOS", "BPM_132", "GRID_64",
|
| 416 |
+
"BAR",
|
| 417 |
+
// Bright G-major chamber-style opening inspired by Mozart's serenades.
|
| 418 |
+
"POS_0", "NOTE_55", "DUR_8", "VEL_6",
|
| 419 |
+
"NOTE_67", "DUR_8", "VEL_6",
|
| 420 |
+
"POS_8", "NOTE_74", "DUR_4", "VEL_7",
|
| 421 |
+
"POS_12", "NOTE_71", "DUR_4", "VEL_6",
|
| 422 |
+
"POS_16", "NOTE_79", "DUR_8", "VEL_7",
|
| 423 |
+
"POS_24", "NOTE_78", "DUR_4", "VEL_6",
|
| 424 |
+
"POS_28", "NOTE_76", "DUR_4", "VEL_6",
|
| 425 |
+
"POS_32", "NOTE_74", "DUR_8", "VEL_7",
|
| 426 |
+
"POS_40", "NOTE_72", "DUR_4", "VEL_6",
|
| 427 |
+
"POS_44", "NOTE_71", "DUR_4", "VEL_6",
|
| 428 |
+
"POS_48", "NOTE_69", "DUR_8", "VEL_6",
|
| 429 |
+
"POS_56", "NOTE_67", "DUR_8", "VEL_7",
|
| 430 |
+
"BAR",
|
| 431 |
+
"POS_0", "NOTE_60", "DUR_16", "VEL_5",
|
| 432 |
+
"NOTE_64", "DUR_16", "VEL_5",
|
| 433 |
+
"NOTE_69", "DUR_16", "VEL_5",
|
| 434 |
+
"POS_16", "NOTE_72", "DUR_4", "VEL_6",
|
| 435 |
+
"POS_20", "NOTE_76", "DUR_4", "VEL_6",
|
| 436 |
+
"POS_24", "NOTE_81", "DUR_8", "VEL_7",
|
| 437 |
+
"POS_32", "NOTE_79", "DUR_4", "VEL_6",
|
| 438 |
+
"POS_36", "NOTE_78", "DUR_4", "VEL_6",
|
| 439 |
+
"POS_40", "NOTE_76", "DUR_4", "VEL_6",
|
| 440 |
+
"POS_44", "NOTE_74", "DUR_4", "VEL_6",
|
| 441 |
+
"POS_48", "NOTE_71", "DUR_8", "VEL_6",
|
| 442 |
+
"POS_56", "NOTE_67", "DUR_8", "VEL_7",
|
| 443 |
+
"BAR"
|
| 444 |
+
];
|
| 445 |
+
} else if (playingStyle === "chopin") {
|
| 446 |
+
allTokensStr = [
|
| 447 |
+
"BOS", "BPM_68", "GRID_64",
|
| 448 |
+
"BAR",
|
| 449 |
+
// Original C-minor nocturne texture: rolling bass beneath a lyrical upper line.
|
| 450 |
+
"POS_0", "NOTE_36", "DUR_16", "VEL_4", "NOTE_72", "DUR_12", "VEL_6",
|
| 451 |
+
"POS_8", "NOTE_43", "DUR_8", "VEL_4",
|
| 452 |
+
"POS_12", "NOTE_75", "DUR_8", "VEL_6",
|
| 453 |
+
"POS_16", "NOTE_48", "DUR_8", "VEL_4",
|
| 454 |
+
"POS_24", "NOTE_51", "DUR_8", "VEL_4", "NOTE_77", "DUR_12", "VEL_6",
|
| 455 |
+
"POS_32", "NOTE_39", "DUR_16", "VEL_4", "NOTE_79", "DUR_16", "VEL_7",
|
| 456 |
+
"POS_40", "NOTE_46", "DUR_8", "VEL_4",
|
| 457 |
+
"POS_48", "NOTE_51", "DUR_8", "VEL_4", "NOTE_77", "DUR_8", "VEL_6",
|
| 458 |
+
"POS_56", "NOTE_55", "DUR_8", "VEL_4", "NOTE_75", "DUR_8", "VEL_5",
|
| 459 |
+
"BAR",
|
| 460 |
+
"POS_0", "NOTE_41", "DUR_16", "VEL_4", "NOTE_72", "DUR_16", "VEL_6",
|
| 461 |
+
"POS_8", "NOTE_48", "DUR_8", "VEL_4",
|
| 462 |
+
"POS_16", "NOTE_53", "DUR_8", "VEL_4", "NOTE_74", "DUR_8", "VEL_6",
|
| 463 |
+
"POS_24", "NOTE_56", "DUR_8", "VEL_4", "NOTE_75", "DUR_8", "VEL_6",
|
| 464 |
+
"POS_32", "NOTE_43", "DUR_16", "VEL_4", "NOTE_79", "DUR_12", "VEL_7",
|
| 465 |
+
"POS_40", "NOTE_50", "DUR_8", "VEL_4",
|
| 466 |
+
"POS_44", "NOTE_77", "DUR_8", "VEL_6",
|
| 467 |
+
"POS_48", "NOTE_55", "DUR_8", "VEL_4",
|
| 468 |
+
"POS_56", "NOTE_60", "DUR_8", "VEL_4", "NOTE_75", "DUR_8", "VEL_5",
|
| 469 |
+
"BAR"
|
| 470 |
+
];
|
| 471 |
+
} else if (playingStyle === "debussy") {
|
| 472 |
+
allTokensStr = [
|
| 473 |
+
"BOS", "BPM_74", "GRID_64",
|
| 474 |
+
"BAR",
|
| 475 |
+
// Original impressionist sketch: open fifths and slowly shifting parallel colors.
|
| 476 |
+
"POS_0", "NOTE_38", "DUR_32", "VEL_3", "NOTE_57", "DUR_16", "VEL_4", "NOTE_62", "DUR_16", "VEL_4", "NOTE_69", "DUR_16", "VEL_5",
|
| 477 |
+
"POS_16", "NOTE_59", "DUR_16", "VEL_4", "NOTE_64", "DUR_16", "VEL_4", "NOTE_71", "DUR_16", "VEL_5",
|
| 478 |
+
"POS_32", "NOTE_45", "DUR_32", "VEL_3", "NOTE_61", "DUR_16", "VEL_4", "NOTE_66", "DUR_16", "VEL_4", "NOTE_73", "DUR_16", "VEL_5",
|
| 479 |
+
"POS_48", "NOTE_64", "DUR_16", "VEL_4", "NOTE_69", "DUR_16", "VEL_4", "NOTE_76", "DUR_16", "VEL_5",
|
| 480 |
+
"BAR",
|
| 481 |
+
"POS_0", "NOTE_40", "DUR_32", "VEL_3", "NOTE_59", "DUR_16", "VEL_4", "NOTE_64", "DUR_16", "VEL_4", "NOTE_71", "DUR_16", "VEL_5",
|
| 482 |
+
"POS_16", "NOTE_61", "DUR_16", "VEL_4", "NOTE_66", "DUR_16", "VEL_4", "NOTE_73", "DUR_16", "VEL_5",
|
| 483 |
+
"POS_32", "NOTE_43", "DUR_32", "VEL_3", "NOTE_62", "DUR_16", "VEL_4", "NOTE_67", "DUR_16", "VEL_4", "NOTE_74", "DUR_16", "VEL_5",
|
| 484 |
+
"POS_48", "NOTE_66", "DUR_16", "VEL_4", "NOTE_71", "DUR_16", "VEL_4", "NOTE_78", "DUR_16", "VEL_5",
|
| 485 |
+
"BAR"
|
| 486 |
+
];
|
| 487 |
+
} else if (playingStyle === "beethoven") {
|
| 488 |
+
allTokensStr = [
|
| 489 |
+
"BOS", "BPM_126", "GRID_64",
|
| 490 |
+
"BAR",
|
| 491 |
+
// Original dramatic sonata gesture: compact motif, octave bass, accented response.
|
| 492 |
+
"POS_0", "NOTE_36", "DUR_8", "VEL_7", "NOTE_48", "DUR_8", "VEL_7", "NOTE_67", "DUR_4", "VEL_7",
|
| 493 |
+
"POS_4", "NOTE_70", "DUR_4", "VEL_7",
|
| 494 |
+
"POS_8", "NOTE_68", "DUR_8", "VEL_8",
|
| 495 |
+
"POS_16", "NOTE_43", "DUR_8", "VEL_6", "NOTE_55", "DUR_8", "VEL_6", "NOTE_65", "DUR_4", "VEL_7",
|
| 496 |
+
"POS_20", "NOTE_68", "DUR_4", "VEL_7",
|
| 497 |
+
"POS_24", "NOTE_67", "DUR_8", "VEL_8",
|
| 498 |
+
"POS_32", "NOTE_39", "DUR_8", "VEL_7", "NOTE_51", "DUR_8", "VEL_7", "NOTE_63", "DUR_4", "VEL_7",
|
| 499 |
+
"POS_36", "NOTE_67", "DUR_4", "VEL_7",
|
| 500 |
+
"POS_40", "NOTE_72", "DUR_8", "VEL_8",
|
| 501 |
+
"POS_48", "NOTE_44", "DUR_8", "VEL_6", "NOTE_56", "DUR_8", "VEL_6", "NOTE_70", "DUR_4", "VEL_7",
|
| 502 |
+
"POS_52", "NOTE_68", "DUR_4", "VEL_7",
|
| 503 |
+
"POS_56", "NOTE_67", "DUR_8", "VEL_8",
|
| 504 |
+
"BAR",
|
| 505 |
+
"POS_0", "NOTE_41", "DUR_16", "VEL_7", "NOTE_53", "DUR_16", "VEL_7", "NOTE_65", "DUR_8", "VEL_7",
|
| 506 |
+
"POS_8", "NOTE_68", "DUR_4", "VEL_7",
|
| 507 |
+
"POS_12", "NOTE_72", "DUR_4", "VEL_8",
|
| 508 |
+
"POS_16", "NOTE_77", "DUR_8", "VEL_8",
|
| 509 |
+
"POS_24", "NOTE_75", "DUR_8", "VEL_7",
|
| 510 |
+
"POS_32", "NOTE_43", "DUR_16", "VEL_7", "NOTE_55", "DUR_16", "VEL_7", "NOTE_74", "DUR_8", "VEL_7",
|
| 511 |
+
"POS_40", "NOTE_72", "DUR_8", "VEL_7",
|
| 512 |
+
"POS_48", "NOTE_67", "DUR_16", "VEL_8", "NOTE_72", "DUR_16", "VEL_8", "NOTE_75", "DUR_16", "VEL_8",
|
| 513 |
+
"BAR"
|
| 514 |
+
];
|
| 515 |
+
} else if (playingStyle === "satie") {
|
| 516 |
+
allTokensStr = [
|
| 517 |
+
"BOS", "BPM_62", "GRID_64",
|
| 518 |
+
"BAR",
|
| 519 |
+
// Original sparse meditation: low bass, suspended chords, unhurried melody.
|
| 520 |
+
"POS_0", "NOTE_38", "DUR_32", "VEL_3", "NOTE_69", "DUR_20", "VEL_5",
|
| 521 |
+
"POS_16", "NOTE_57", "DUR_24", "VEL_3", "NOTE_62", "DUR_24", "VEL_3", "NOTE_65", "DUR_24", "VEL_3",
|
| 522 |
+
"POS_32", "NOTE_45", "DUR_32", "VEL_3", "NOTE_72", "DUR_16", "VEL_5",
|
| 523 |
+
"POS_48", "NOTE_55", "DUR_24", "VEL_3", "NOTE_60", "DUR_24", "VEL_3", "NOTE_64", "DUR_24", "VEL_3",
|
| 524 |
+
"BAR",
|
| 525 |
+
"POS_0", "NOTE_40", "DUR_32", "VEL_3", "NOTE_71", "DUR_20", "VEL_5",
|
| 526 |
+
"POS_16", "NOTE_59", "DUR_24", "VEL_3", "NOTE_64", "DUR_24", "VEL_3", "NOTE_67", "DUR_24", "VEL_3",
|
| 527 |
+
"POS_32", "NOTE_43", "DUR_32", "VEL_3", "NOTE_74", "DUR_16", "VEL_5",
|
| 528 |
+
"POS_48", "NOTE_57", "DUR_24", "VEL_3", "NOTE_62", "DUR_24", "VEL_3", "NOTE_66", "DUR_24", "VEL_3",
|
| 529 |
+
"BAR"
|
| 530 |
+
];
|
| 531 |
+
} else if (playingStyle === "dark") {
|
| 532 |
+
allTokensStr = [
|
| 533 |
+
"BOS", "BPM_76", "GRID_64",
|
| 534 |
+
"BAR",
|
| 535 |
+
// Original dark prelude: chromatic bass motion and tense minor voicings.
|
| 536 |
+
"POS_0", "NOTE_33", "DUR_16", "VEL_6", "NOTE_45", "DUR_16", "VEL_6", "NOTE_60", "DUR_12", "VEL_5", "NOTE_64", "DUR_12", "VEL_5",
|
| 537 |
+
"POS_16", "NOTE_32", "DUR_16", "VEL_6", "NOTE_44", "DUR_16", "VEL_6", "NOTE_59", "DUR_12", "VEL_5", "NOTE_63", "DUR_12", "VEL_5",
|
| 538 |
+
"POS_32", "NOTE_31", "DUR_16", "VEL_7", "NOTE_43", "DUR_16", "VEL_7", "NOTE_58", "DUR_12", "VEL_5", "NOTE_62", "DUR_12", "VEL_5",
|
| 539 |
+
"POS_48", "NOTE_30", "DUR_16", "VEL_7", "NOTE_42", "DUR_16", "VEL_7", "NOTE_57", "DUR_12", "VEL_6", "NOTE_61", "DUR_12", "VEL_6",
|
| 540 |
+
"BAR",
|
| 541 |
+
"POS_0", "NOTE_29", "DUR_16", "VEL_7", "NOTE_41", "DUR_16", "VEL_7", "NOTE_56", "DUR_12", "VEL_5", "NOTE_60", "DUR_12", "VEL_5",
|
| 542 |
+
"POS_16", "NOTE_34", "DUR_16", "VEL_6", "NOTE_46", "DUR_16", "VEL_6", "NOTE_61", "DUR_12", "VEL_5", "NOTE_65", "DUR_12", "VEL_5",
|
| 543 |
+
"POS_32", "NOTE_35", "DUR_16", "VEL_6", "NOTE_47", "DUR_16", "VEL_6", "NOTE_62", "DUR_12", "VEL_5", "NOTE_66", "DUR_12", "VEL_5",
|
| 544 |
+
"POS_48", "NOTE_36", "DUR_16", "VEL_7", "NOTE_48", "DUR_16", "VEL_7", "NOTE_60", "DUR_16", "VEL_6", "NOTE_63", "DUR_16", "VEL_6",
|
| 545 |
+
"BAR"
|
| 546 |
+
];
|
| 547 |
} else {
|
| 548 |
allTokensStr = ["BOS", "BPM_120", "GRID_64", "BAR", "POS_0"];
|
| 549 |
}
|
|
|
|
| 614 |
temperature = data.temperature;
|
| 615 |
topK = data.topK;
|
| 616 |
currentBpm = data.bpm;
|
| 617 |
+
playingStyle = data.playingStyle || "default";
|
| 618 |
midiTokens = data.midiTokens;
|
| 619 |
midiStartBar = data.midiStartBar;
|
| 620 |
midiBpmMode = data.midiBpmMode || "lock";
|
|
|
|
|
|
|
|
|
|
| 621 |
|
| 622 |
parser = makeParser();
|
| 623 |
parser.reset();
|