You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 7ba5765
Browse filesBrowse the repository at this point in the historyBrowse files
- PASS: `npx playwright test tests/playwright/tools/MidiStudioV2.spec.mjs -g "octave timeline editor is the default editable and playable Studio workflow|octave grid density supports icon controls and simultaneous chord editing" --reporter=list --workers=1 --timeout=60000`
28
+
- 2 passed.
29
+
- PASS: `git diff --check`
30
+
- No whitespace errors. Git emitted LF-to-CRLF working-copy warnings for touched text files.
31
+
32
+
## Required Proof Points
33
+
34
+
- PASS: octave timeline editor remains visible by default.
35
+
- PASS: songs populate the left Songs column from the imported manifest.
36
+
- PASS: instrument controls populate the left Instruments column.
37
+
- PASS: visibility control uses icon-only button text with accessible labels.
38
+
- PASS: mute, solo, eye, and delete controls stay on one horizontal row.
39
+
- PASS: octave rows are denser/shorter.
40
+
- PASS: visible octave note cells render direct text without `.midi-studio-v2__note-block` wrappers.
41
+
- PASS: GM type dropdown and dependent instrument dropdown behavior is preserved.
42
+
- PASS: multiple notes can exist in the same bar/beat column.
43
+
- PASS: adding one note does not remove sibling notes in the same bar/beat.
44
+
- PASS: chords/multi-note cells playback as simultaneous same-time oscillator starts.
45
+
- PASS: drum rows support simultaneous same-time events.
Copy file name to clipboardExpand all lines: src/engine/audio/InstrumentGridParser.js
+23-3Lines changed: 23 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -240,6 +240,12 @@ export class InstrumentGridParser {
240
240
if(lane==="drums"||this.isDrumToken(value)){
241
241
returnthis.normalizeDrums({ cell, timing, value });
242
242
}
243
+
if(value.includes("+")){
244
+
returnthis.normalizeNotes({ cell, timing, value });
245
+
}
246
+
if(NOTE_PATTERN.test(value)){
247
+
return{ cell,events: [this.eventForCell({ cell,kind: "note", value })],ok: true,warnings: []};
248
+
}
243
249
if(lane==="chords"){
244
250
if(!CHORD_PATTERN.test(value)){
245
251
return{message: `Invalid chord token "${value}" in ${lane} at bar ${timing.bar}, beat ${timing.beat}.`,ok: false};
@@ -249,10 +255,24 @@ export class InstrumentGridParser {
249
255
if(lane==="pad"&&CHORD_PATTERN.test(value)){
250
256
return{ cell,events: [this.eventForCell({ cell,kind: "chord", value })],ok: true,warnings: []};
251
257
}
252
-
if(!NOTE_PATTERN.test(value)){
253
-
return{message: `Invalid note token "${value}" in ${lane} at bar ${timing.bar}, beat ${timing.beat}. Use notes like C4 or rests (-).`,ok: false};
258
+
return{message: `Invalid note token "${value}" in ${lane} at bar ${timing.bar}, beat ${timing.beat}. Use notes like C4, C4+E4, or rests (-).`,ok: false};
0 commit comments