Browse Source

Add pulse outputs to MIDI-1

tags/v0.6.0
Andrew Belt 7 years ago
parent
commit
d5f7325ede
2 changed files with 33 additions and 15 deletions
  1. +23
    -7
      src/Core/MIDIToCVInterface.cpp
  2. +10
    -8
      src/midi.cpp

+ 23
- 7
src/Core/MIDIToCVInterface.cpp View File

@@ -1,5 +1,6 @@
#include "Core.hpp" #include "Core.hpp"
#include "midi.hpp" #include "midi.hpp"
#include "dsp/digital.hpp"
#include "dsp/filter.hpp" #include "dsp/filter.hpp"


#include <algorithm> #include <algorithm>
@@ -43,6 +44,10 @@ struct MIDIToCVInterface : Module {
ExponentialFilter modFilter; ExponentialFilter modFilter;
uint16_t pitch = 0; uint16_t pitch = 0;
ExponentialFilter pitchFilter; ExponentialFilter pitchFilter;
PulseGenerator startPulse;
PulseGenerator stopPulse;
PulseGenerator continuePulse;
PulseGenerator clockPulse;


MidiNoteData noteData[128]; MidiNoteData noteData[128];
std::list<uint8_t> heldNotes; std::list<uint8_t> heldNotes;
@@ -102,21 +107,28 @@ struct MIDIToCVInterface : Module {
while (midiInput.shift(&msg)) { while (midiInput.shift(&msg)) {
processMessage(msg); processMessage(msg);
} }
float deltaTime = engineGetSampleTime();


outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f; outputs[CV_OUTPUT].value = (lastNote - 60) / 12.f;
outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f; outputs[GATE_OUTPUT].value = gate ? 10.f : 0.f;
outputs[VELOCITY_OUTPUT].value = rescale(noteData[lastNote].velocity, 0, 127, 0.f, 10.f); outputs[VELOCITY_OUTPUT].value = rescale(noteData[lastNote].velocity, 0, 127, 0.f, 10.f);
modFilter.lambda = 100.f * engineGetSampleTime();
modFilter.lambda = 100.f * deltaTime;
outputs[MOD_OUTPUT].value = modFilter.process(rescale(mod, 0, 127, 0.f, 10.f)); outputs[MOD_OUTPUT].value = modFilter.process(rescale(mod, 0, 127, 0.f, 10.f));


pitchFilter.lambda = 100.f * engineGetSampleTime();
pitchFilter.lambda = 100.f * deltaTime;
outputs[PITCH_OUTPUT].value = pitchFilter.process(rescale(pitch, 0, 16384, -5.f, 5.f)); outputs[PITCH_OUTPUT].value = pitchFilter.process(rescale(pitch, 0, 16384, -5.f, 5.f));


outputs[AFTERTOUCH_OUTPUT].value = rescale(noteData[lastNote].aftertouch, 0, 127, 0.f, 10.f); outputs[AFTERTOUCH_OUTPUT].value = rescale(noteData[lastNote].aftertouch, 0, 127, 0.f, 10.f);

outputs[START_OUTPUT].value = startPulse.process(deltaTime) ? 10.f : 0.f;
outputs[STOP_OUTPUT].value = stopPulse.process(deltaTime) ? 10.f : 0.f;
outputs[CONTINUE_OUTPUT].value = continuePulse.process(deltaTime) ? 10.f : 0.f;

outputs[CLOCK_OUTPUT].value = clockPulse.process(deltaTime) ? 10.f : 0.f;
} }


void processMessage(MidiMessage msg) { void processMessage(MidiMessage msg) {
debug("MIDI: %01x %01x %02x %02x", msg.status(), msg.channel(), msg.data1, msg.data2);
// debug("MIDI: %01x %01x %02x %02x", msg.status(), msg.channel(), msg.data1, msg.data2);


switch (msg.status()) { switch (msg.status()) {
// note off // note off
@@ -174,17 +186,21 @@ struct MIDIToCVInterface : Module {


void processSystem(MidiMessage msg) { void processSystem(MidiMessage msg) {
switch (msg.channel()) { switch (msg.channel()) {
// Timing
case 0x8: { case 0x8: {
debug("timing clock");
clockPulse.trigger(1e-3);
} break; } break;
// Start
case 0xa: { case 0xa: {
debug("start");
startPulse.trigger(1e-3);
} break; } break;
// Continue
case 0xb: { case 0xb: {
debug("continue");
continuePulse.trigger(1e-3);
} break; } break;
// Stop
case 0xc: { case 0xc: {
debug("stop");
stopPulse.trigger(1e-3);
} break; } break;
default: break; default: break;
} }


+ 10
- 8
src/midi.cpp View File

@@ -129,18 +129,20 @@ static void midiInputCallback(double timeStamp, std::vector<unsigned char> *mess


MidiInput *midiInput = (MidiInput*) userData; MidiInput *midiInput = (MidiInput*) userData;
if (!midiInput) return; if (!midiInput) return;
MidiMessage midiMessage;
MidiMessage msg;
if (message->size() >= 1) if (message->size() >= 1)
midiMessage.cmd = (*message)[0];
msg.cmd = (*message)[0];
if (message->size() >= 2) if (message->size() >= 2)
midiMessage.data1 = (*message)[1];
msg.data1 = (*message)[1];
if (message->size() >= 3) if (message->size() >= 3)
midiMessage.data2 = (*message)[2];
msg.data2 = (*message)[2];


// Filter channel // Filter channel
if (midiInput->channel >= 0 && (midiMessage.channel() != midiInput->channel))
return;
midiInput->onMessage(midiMessage);
if (midiInput->channel >= 0) {
if (msg.status() != 0xf && msg.channel() != midiInput->channel)
return;
}
midiInput->onMessage(msg);
} }


MidiInput::MidiInput() { MidiInput::MidiInput() {
@@ -157,7 +159,7 @@ void MidiInput::setDriver(int driver) {
if (driver >= 0) { if (driver >= 0) {
rtMidiIn = new RtMidiIn((RtMidi::Api) driver); rtMidiIn = new RtMidiIn((RtMidi::Api) driver);
rtMidiIn->setCallback(midiInputCallback, this); rtMidiIn->setCallback(midiInputCallback, this);
rtMidiIn->ignoreTypes(enableSysEx, enableTime, enableSense);
rtMidiIn->ignoreTypes(!enableSysEx, !enableTime, !enableSense);
rtMidi = rtMidiIn; rtMidi = rtMidiIn;
this->driver = rtMidiIn->getCurrentApi(); this->driver = rtMidiIn->getCurrentApi();
} }


Loading…
Cancel
Save