From 7980d5f881e6f9b8e400c62691a1a17cd3ad781b Mon Sep 17 00:00:00 2001 From: Francois Best Date: Wed, 21 May 2014 08:55:12 +0200 Subject: [PATCH] Fixed gate logic. --- .../MIDI_SimpleSynth/MIDI_SimpleSynth.ino | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/res/Examples/MIDI_SimpleSynth/MIDI_SimpleSynth.ino b/res/Examples/MIDI_SimpleSynth/MIDI_SimpleSynth.ino index 205611a..18b3387 100644 --- a/res/Examples/MIDI_SimpleSynth/MIDI_SimpleSynth.ino +++ b/res/Examples/MIDI_SimpleSynth/MIDI_SimpleSynth.ino @@ -18,12 +18,12 @@ MidiNoteList midiNotes; // ----------------------------------------------------------------------------- -void handleGateChanged(bool inGateActive) +inline void handleGateChanged(bool inGateActive) { digitalWrite(sGatePin, inGateActive ? HIGH : LOW); } -void pulseGate() +inline void pulseGate() { handleGateChanged(false); delay(1); @@ -32,41 +32,40 @@ void pulseGate() // ----------------------------------------------------------------------------- -void handleNotesChanged() +void handleNoteOn(byte inChannel, byte inNote, byte inVelocity) { - if (midiNotes.empty()) - { - handleGateChanged(false); - noTone(sAudioOutPin); - } - else - { - // Possible playing modes: - // Mono Low: use midiNotes.getLow - // Mono High: use midiNotes.getHigh - // Mono Last: use midiNotes.getLast + const bool firstNote = midiNotes.empty(); + midiNotes.add(MidiNote(inNote, inVelocity)); + + // Possible playing modes: + // Mono Low: use midiNotes.getLow + // Mono High: use midiNotes.getHigh + // Mono Last: use midiNotes.getLast - byte currentNote = 0; - if (midiNotes.getLast(currentNote)) + byte currentNote = 0; + if (midiNotes.getLast(currentNote)) + { + tone(sAudioOutPin, sNotePitches[currentNote]); + + if (firstNote) + { + handleGateChanged(true); + } + else { - tone(sAudioOutPin, sNotePitches[currentNote]); pulseGate(); // Retrigger envelopes. Remove for legato effect. } } } -// ----------------------------------------------------------------------------- - -void handleNoteOn(byte inChannel, byte inNote, byte inVelocity) -{ - midiNotes.add(MidiNote(inNote, inVelocity)); - handleNotesChanged(); -} - void handleNoteOff(byte inChannel, byte inNote, byte inVelocity) { midiNotes.remove(inNote); - handleNotesChanged(); + if (midiNotes.empty()) + { + handleGateChanged(false); + noTone(sAudioOutPin); + } } // -----------------------------------------------------------------------------