Skip to content

Instantly share code, notes, and snippets.

@hsitz
Last active March 11, 2020 17:56
Show Gist options
  • Save hsitz/b60580de94e841bd9f2ab3dfeba2dc7c to your computer and use it in GitHub Desktop.
Save hsitz/b60580de94e841bd9f2ab3dfeba2dc7c to your computer and use it in GitHub Desktop.
new version
@OnLoad
counter = 0
chordtype=0
FillArray chordnote, -1, 10
FillArray note_is_on, NO, 72
DIM=1
MAJ=2
MIN=3
SEVENTH=4
@End
@OnMidiNote
chordnote[counter] = MIDIByte2
if counter = 2
chordtype=0
interval1 = chordnote[1] - chordnote[0]
interval2 = chordnote[2] - chordnote[1]
// I think logic below works, but
// could be fleshed out with redundancies
// to make things clearer
if (interval1 % 3 = 0) and (interval2 % 4 = 0)
chordtype=MIN
elseif (interval1 % 3 = 0)
chordtype=DIM
elseif (interval2 % 6 = 0)
chordtype=SEVENTH
else
chordtype=MAJ
endif
endif
// we know if we've got a 7th or dim7 chord when
// counter=2, but we want to wait until counter=3 for those
if (chordtype=min) or (chordtype=maj) or (counter = 3)
// We have all the notes of the chord,
// whether it's 3 notes or 4 notes
call @ProcessChord
// reset, we won't know type of
//next chord until we get next chord's chordnote[2]
chordtype=0
counter = 0
else
inc counter // we don't have a full chord yet
endif
@END
@ProcessChord
if chordtype = MIN // root and 3rd
note1=chordnote[0]+12
note2=chordnote[1]+12
elseif chordtype = MAJ
note1 = chordnote[0]+4
note2 = chordnote[0]+7
elseif chordtype = SEVENTH // root, 3rd
note1 = chordnote[0]
note2 = chordnote[1]
elseif chordtype = DIM //
note1 = chordnote[0]
note2 = 0
else
log { we're not supposed to get here }
endif
call @SendNoteCommands
@END
@SendNoteCommands
log {- }
log {---- entering @SendNoteCommands with chordtype }, chordtype
log {entering-note-1: command: }, MIDICommand, { note1: }, note1, { note is on?: }, note_is_on[note1]
log {entering-note-2: command: }, MIDICommand, { note2: }, note2, { note_is_on?: }, note_is_on[note2]
if MIDICommand = 144 // turn midi notes on
// if not already on
if note_is_on[note1] = NO
SendMIDIOut MIDIByte1, note1, MIDIByte3
note_is_on[note1] = YES
log {turned note1 ( }, note1, {) ON.}
if (note2 > 0) and note_is_on[note2] = NO
SendMIDIOut MIDIByte1, note2, MIDIByte3
note_is_on[note2]=YES
log {turned note2 ( }, note2, {) ON.}
endif
endif
else // Send Note Off command only if no chord is using note
if note_is_on[note1] = YES
SendMIDIOut MIDIByte1, note1, MIDIByte3
note_is_on[note1] = NO
log {turned note1 ( }, note1, {) OFF.}
endif
if (note2 > 0) and (note_is_on[note2] = YES)
SendMIDIOut MIDIByte1, note2, MIDIByte3
note_is_on[note2] = NO
log {turned note2 ( }, note2, {) OFF.}
endif
log {exiting--note-1: }, note1, { note is on?: }, note_is_on[note1]
log {exiting-note-2: }, note2, { note_is_on?: }, note_is_on[note2]
endif
@END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment