// Midi Chord Keycodes
+bool midi_chord(uint8_t mode, uint16_t root);
+
+enum midi_chord_modes {
+ major = 0,
+ minor,
+};
+
enum midi_chord_keycodes {
//Major Chords
),
};
+
+// Midi Chord Function
+
+bool midi_chord(uint8_t mode, uint16_t root) {
+ switch (mode) {
+ case 0:
+ uint8_t channel = midi_config.channel;
+ uint8_t tone = root - MIDI_TONE_MIN;
+ uint8_t velocity = compute_velocity(midi_config.velocity);
+ if (record->event.pressed) {
+ uint8_t root_note = midi_compute_note(root);
+ uint8_t major_third = midi_compute_note(root) + 4;
+ uint8_t fifth = midi_compute_note(root) + 7;
+ midi_send_noteon(&midi_device, channel, root_note, velocity);
+ midi_send_noteon(&midi_device, channel, major_third, velocity);
+ midi_send_noteon(&midi_device, channel, fifth, velocity);
+ tone_status[tone] = root_note;
+ }
+ else {
+ uint8_t root_note = tone_status[tone];
+ uint8_t major_third = root_note + 4;
+ uint8_t fifth = root_note + 7;
+ if (root_note != MIDI_INVALID_NOTE)
+ {
+ midi_send_noteoff(&midi_device, channel, root_note, velocity);
+ midi_send_noteoff(&midi_device, channel, major_third, velocity);
+ midi_send_noteoff(&midi_device, channel, fifth, velocity);
+ }
+ tone_status[tone] = MIDI_INVALID_NOTE;
+ }
+ return false;
+ case 1:
+ uint8_t channel = midi_config.channel;
+ uint8_t tone = root - MIDI_TONE_MIN;
+ uint8_t velocity = compute_velocity(midi_config.velocity);
+ if (record->event.pressed) {
+ uint8_t root_note = midi_compute_note(root);
+ uint8_t minor_third = midi_compute_note(root) + 3;
+ uint8_t fifth = midi_compute_note(root) + 7;
+ midi_send_noteon(&midi_device, channel, root_note, velocity);
+ midi_send_noteon(&midi_device, channel, major_third, velocity);
+ midi_send_noteon(&midi_device, channel, fifth, velocity);
+ tone_status[tone] = root_note;
+ }
+ else {
+ uint8_t root_note = tone_status[tone];
+ uint8_t minor_third = root_note + 3;
+ uint8_t fifth = root_note + 7;
+ if (root_note != MIDI_INVALID_NOTE)
+ {
+ midi_send_noteoff(&midi_device, channel, root_note, velocity);
+ midi_send_noteoff(&midi_device, channel, minor_third, velocity);
+ midi_send_noteoff(&midi_device, channel, fifth, velocity);
+ }
+ tone_status[tone] = MIDI_INVALID_NOTE;
+ }
+ return false;
+ };
+ return true;
+};
+