mdedwards / slippery-chicken

slippery chicken: algorithmic composition software in common lisp and clos
http://michael-edwards.org/sc
72 stars 3 forks source link

midi-file-to-events function #59

Closed mt-collins closed 8 months ago

mt-collins commented 2 years ago

There seems to be an issue with the midi-file-to-events function at the moment where the first event in a MIDI file is always omitted from the outputted events list.

midi-tests.zip

The attached MIDI files are just two examples of several I've tried with this function -- always with the same result. test-midifile.mid is from the SC test suite and cmajor2.mid is of my own creation. Below is the first few events of what's returned for me when the latter file is passed to the function. The first event returned has start time of 0.500 and pitch D4, when the first event should be start time 0.000 and pitch C4:

(
EVENT: start-time: 0.500, end-time: NIL, 
       duration-in-tempo: 0.500, 
       compound-duration-in-tempo: 0.500, 
       amplitude: 1.000 
       bar-num: -1, marks-before: NIL, 
       tempo-change: NIL 
       instrument-change: NIL 
       display-tempo: NIL, start-time-qtrs: 1.000, 
       midi-time-sig: NIL, midi-program-changes: NIL, 
       midi-control-changes: NIL, 
       8va: 0, player: NIL
       asco-label: NIL, asco-msgs: NIL
       set-ref: NIL
       pitch-or-chord: 
PITCH: frequency: 293.665, midi-note: 62, midi-channel: 1 
       pitch-bend: 0.0 
       degree: 124, data-consistent: T, white-note: D4
       nearest-chromatic: D4
       src: 1.1224622, src-ref-pitch: C4, score-note: D4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: D, no-8ve-no-acc: D
       show-accidental: T, white-degree: 36, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: D4, tag: NIL, 
data: D4
**************

       written-pitch-or-chord: NIL
RHYTHM: value: 4.000, duration: 1.000, rq: 1, is-rest: NIL, 
        is-whole-bar-rest: NIL, 
        score-rthm: 4.0, undotted-value: 4, num-flags: 0, num-dots: 0, 
        is-tied-to: NIL, is-tied-from: NIL, compound-duration: 1.000, 
        is-grace-note: NIL, needs-new-note: T, beam: NIL, bracket: NIL, 
        rqq-note: NIL, rqq-info: NIL, marks: (FFFF), marks-in-part: NIL, 
        letter-value: 4, tuplet-scaler: 1, bar-pos: -1, 
        grace-note-duration: 0.05
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: Q, tag: NIL, 
data: Q
**************

EVENT: start-time: 1.000, end-time: NIL, 
       duration-in-tempo: 0.500, 
       compound-duration-in-tempo: 0.500, 
       amplitude: 1.000 
       bar-num: -1, marks-before: NIL, 
       tempo-change: NIL 
       instrument-change: NIL 
       display-tempo: NIL, start-time-qtrs: 2.000, 
       midi-time-sig: NIL, midi-program-changes: NIL, 
       midi-control-changes: NIL, 
       8va: 0, player: NIL
       asco-label: NIL, asco-msgs: NIL
       set-ref: NIL
       pitch-or-chord: 
PITCH: frequency: 329.628, midi-note: 64, midi-channel: 1 
       pitch-bend: 0.0 
       degree: 128, data-consistent: T, white-note: E4
       nearest-chromatic: E4
       src: 1.2599212, src-ref-pitch: C4, score-note: E4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: E, no-8ve-no-acc: E
       show-accidental: T, white-degree: 37, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: E4, tag: NIL, 
data: E4
**************

       written-pitch-or-chord: NIL
RHYTHM: value: 4.000, duration: 1.000, rq: 1, is-rest: NIL, 
        is-whole-bar-rest: NIL, 
        score-rthm: 4.0, undotted-value: 4, num-flags: 0, num-dots: 0, 
        is-tied-to: NIL, is-tied-from: NIL, compound-duration: 1.000, 
        is-grace-note: NIL, needs-new-note: T, beam: NIL, bracket: NIL, 
        rqq-note: NIL, rqq-info: NIL, marks: (FFFF), marks-in-part: NIL, 
        letter-value: 4, tuplet-scaler: 1, bar-pos: -1, 
        grace-note-duration: 0.05
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: Q, tag: NIL, 
data: Q
**************

EVENT: start-time: 1.500, end-time: NIL, 
       duration-in-tempo: 0.500, 
       compound-duration-in-tempo: 0.500, 
       amplitude: 1.000 
       bar-num: -1, marks-before: NIL, 
       tempo-change: NIL 
       instrument-change: NIL 
       display-tempo: NIL, start-time-qtrs: 3.000, 
       midi-time-sig: NIL, midi-program-changes: NIL, 
       midi-control-changes: NIL, 
       8va: 0, player: NIL
       asco-label: NIL, asco-msgs: NIL
       set-ref: NIL
       pitch-or-chord: 
PITCH: frequency: 349.228, midi-note: 65, midi-channel: 1 
       pitch-bend: 0.0 
       degree: 130, data-consistent: T, white-note: F4
       nearest-chromatic: F4
       src: 1.3348399, src-ref-pitch: C4, score-note: F4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: F, no-8ve-no-acc: F
       show-accidental: T, white-degree: 38, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: F4, tag: NIL, 
data: F4
**************

       written-pitch-or-chord: NIL
RHYTHM: value: 4.000, duration: 1.000, rq: 1, is-rest: NIL, 
        is-whole-bar-rest: NIL, 
        score-rthm: 4.0, undotted-value: 4, num-flags: 0, num-dots: 0, 
        is-tied-to: NIL, is-tied-from: NIL, compound-duration: 1.000, 
        is-grace-note: NIL, needs-new-note: T, beam: NIL, bracket: NIL, 
        rqq-note: NIL, rqq-info: NIL, marks: (FFFF), marks-in-part: NIL, 
        letter-value: 4, tuplet-scaler: 1, bar-pos: -1, 
        grace-note-duration: 0.05
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: Q, tag: NIL, 
data: Q
**************

Similarly for test-midifile.mid, which has several instruments:

(
EVENT: start-time: 0.500, end-time: NIL, 
       duration-in-tempo: 0.500, 
       compound-duration-in-tempo: 0.500, 
       amplitude: 0.693 
       bar-num: -1, marks-before: NIL, 
       tempo-change: NIL 
       instrument-change: NIL 
       display-tempo: NIL, start-time-qtrs: 2.500, 
       midi-time-sig: NIL, midi-program-changes: NIL, 
       midi-control-changes: NIL, 
       8va: 0, player: NIL
       asco-label: NIL, asco-msgs: NIL
       set-ref: NIL
       pitch-or-chord: 
CHORD: auto-sort: T, marks: NIL, micro-tone: NIL, micro-tonality: 0.0
centroid: NIL, dissonance: NIL
SCLIST: sclist-length: 3, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: NIL, tag: NIL, 
data: (
PITCH: frequency: 329.628, midi-note: 64, midi-channel: 2 
       pitch-bend: 0.0 
       degree: 128, data-consistent: T, white-note: E4
       nearest-chromatic: E4
       src: 1.2599212, src-ref-pitch: C4, score-note: E4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: E, no-8ve-no-acc: E
       show-accidental: T, white-degree: 37, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: E4, tag: NIL, 
data: E4
**************

PITCH: frequency: 391.995, midi-note: 67, midi-channel: 3 
       pitch-bend: 0.0 
       degree: 134, data-consistent: T, white-note: G4
       nearest-chromatic: G4
       src: 1.4983071, src-ref-pitch: C4, score-note: G4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: G, no-8ve-no-acc: G
       show-accidental: T, white-degree: 39, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: G4, tag: NIL, 
data: G4
**************

PITCH: frequency: 493.883, midi-note: 71, midi-channel: 1 
       pitch-bend: 0.0 
       degree: 142, data-consistent: T, white-note: B4
       nearest-chromatic: B4
       src: 1.8877487, src-ref-pitch: C4, score-note: B4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: B, no-8ve-no-acc: B
       show-accidental: T, white-degree: 41, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: B4, tag: NIL, 
data: B4
**************
)
**************

       written-pitch-or-chord: NIL
RHYTHM: value: 8.000, duration: 0.500, rq: 1/2, is-rest: NIL, 
        is-whole-bar-rest: NIL, 
        score-rthm: 8.0, undotted-value: 8, num-flags: 1, num-dots: 0, 
        is-tied-to: NIL, is-tied-from: NIL, compound-duration: 0.500, 
        is-grace-note: NIL, needs-new-note: T, beam: NIL, bracket: NIL, 
        rqq-note: NIL, rqq-info: NIL, marks: (F), marks-in-part: NIL, 
        letter-value: 8, tuplet-scaler: 1, bar-pos: -1, 
        grace-note-duration: 0.05
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: E, tag: NIL, 
data: E
**************

EVENT: start-time: 1.000, end-time: NIL, 
       duration-in-tempo: 0.500, 
       compound-duration-in-tempo: 0.500, 
       amplitude: 0.693 
       bar-num: -1, marks-before: NIL, 
       tempo-change: NIL 
       instrument-change: NIL 
       display-tempo: NIL, start-time-qtrs: 4.000, 
       midi-time-sig: NIL, midi-program-changes: NIL, 
       midi-control-changes: NIL, 
       8va: 0, player: NIL
       asco-label: NIL, asco-msgs: NIL
       set-ref: NIL
       pitch-or-chord: 
CHORD: auto-sort: T, marks: NIL, micro-tone: NIL, micro-tonality: 0.0
centroid: NIL, dissonance: NIL
SCLIST: sclist-length: 3, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: NIL, tag: NIL, 
data: (
PITCH: frequency: 261.626, midi-note: 60, midi-channel: 3 
       pitch-bend: 0.0 
       degree: 120, data-consistent: T, white-note: C4
       nearest-chromatic: C4
       src: 1.0, src-ref-pitch: C4, score-note: C4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: C, no-8ve-no-acc: C
       show-accidental: T, white-degree: 35, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: C4, tag: NIL, 
data: C4
**************

PITCH: frequency: 293.665, midi-note: 62, midi-channel: 2 
       pitch-bend: 0.0 
       degree: 124, data-consistent: T, white-note: D4
       nearest-chromatic: D4
       src: 1.1224622, src-ref-pitch: C4, score-note: D4 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 4, c5ths: 0, no-8ve: D, no-8ve-no-acc: D
       show-accidental: T, white-degree: 36, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: D4, tag: NIL, 
data: D4
**************

PITCH: frequency: 523.251, midi-note: 72, midi-channel: 1 
       pitch-bend: 0.0 
       degree: 144, data-consistent: T, white-note: C5
       nearest-chromatic: C5
       src: 2.0, src-ref-pitch: C4, score-note: C5 
       qtr-sharp: NIL, qtr-flat: NIL, qtr-tone: NIL,  
       micro-tone: NIL, 
       sharp: NIL, flat: NIL, natural: T, 
       octave: 5, c5ths: 0, no-8ve: C, no-8ve-no-acc: C
       show-accidental: T, white-degree: 42, 
       accidental: N, 
       accidental-in-parentheses: NIL, marks: NIL, 
       marks-before: NIL, amplitude: NIL
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: C5, tag: NIL, 
data: C5
**************
)
**************

       written-pitch-or-chord: NIL
RHYTHM: value: 8.000, duration: 0.500, rq: 1/2, is-rest: NIL, 
        is-whole-bar-rest: NIL, 
        score-rthm: 8.0, undotted-value: 8, num-flags: 1, num-dots: 0, 
        is-tied-to: NIL, is-tied-from: NIL, compound-duration: 0.500, 
        is-grace-note: NIL, needs-new-note: T, beam: NIL, bracket: NIL, 
        rqq-note: NIL, rqq-info: NIL, marks: (F), marks-in-part: NIL, 
        letter-value: 8, tuplet-scaler: 1, bar-pos: -1, 
        grace-note-duration: 0.05
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: E, tag: NIL, 
data: E
**************

Hopefully I haven't missed anything obvious here!

mdedwards commented 2 years ago

Good catch Matt, thanks for this. I think I found it. Caused some head scratching but it turns out I'd shot myself in the foot by trying to save execution time by not reversing potentially long lists of events and instead doing all the processing in reverse. Serves me right for thinking I can run backwards. We all know what happens there. Latest source on the Michael branch should help you out here. Ping this back to me if not. Best, Michael

mt-collins commented 2 years ago

Thanks Michael, that's great. I think it's all working fine now!