Browse Source

Change to extend range of allowed MIDI note glyphs

Fixes #37
master
cancel 5 years ago
parent
commit
ac088f1113
  1. 33
      sim.c
  2. 2
      tui_main.c

33
sim.c

@ -99,34 +99,13 @@ ORCA_PURE static bool oper_has_neighboring_bang(Glyph const *gbuf, Usz h, Usz w,
// Returns UINT8_MAX if not a valid note.
static U8 midi_note_number_of(Glyph g) {
switch (g) {
case 'C':
return 0;
case 'c':
return 1;
case 'D':
return 2;
case 'd':
return 3;
case 'E':
return 4;
case 'F':
return 5;
case 'f':
return 6;
case 'G':
return 7;
case 'g':
return 8;
case 'A':
return 9;
case 'a':
return 10;
case 'B':
return 11;
default:
int deg, sharp = (g & 1 << 5) >> 5; // sharp=1 if lowercase
g &= ~(1 << 5); // make uppercase
if (g < 'A' || g > 'Z') // A through Z only
return UINT8_MAX;
}
// We want C=0, D=1, E=2, etc. A and B are equivalent to H and I.
deg = g <= 'B' ? 'G' - 'B' + g - 'A' : g - 'C';
return (U8)(deg / 7 * 12 + (I8[]){0, 2, 4, 5, 7, 9, 11}[deg % 7] + sharp);
}
typedef struct {

2
tui_main.c

@ -1046,6 +1046,8 @@ void send_output_events(Oosc_dev *oosc_dev, Midi_mode const *midi_mode, Usz bpm,
case Oevent_type_midi: {
Oevent_midi const *em = &e->midi;
Usz note_number = (Usz)(12u * em->octave + em->note);
if (note_number > 127)
note_number = 127;
Usz channel = em->channel;
Usz bar_div = em->bar_divisor;
midi_note_ons[midi_note_count] =

Loading…
Cancel
Save