17template <
int CHANNELS>
39 for (
int c = 0; c < CHANNELS; c++) {
46 for (
int i = 0; i < 128; i++) {
59 for (
int note = 0; note <= 127; note++) {
74 for (uint8_t c =
channels; c < this->channels; c++) {
86 bool changedNote = gate &&
gates[c] && (note !=
notes[c]);
87 bool enabledGate = gate && !
gates[c];
88 bool disabledGate = !gate &&
gates[c];
89 if (changedNote || disabledGate) {
98 if (changedNote || enabledGate) {
184 if (this->clk ==
clk)
199 if (this->start ==
start)
214 if (this->cont ==
cont)
229 if (this->stop ==
stop)
254template <u
int8_t MAX_CHANNELS>
313 int16_t
pws[MAX_CHANNELS];
351 for (uint8_t c = 0; c < MAX_CHANNELS; c++) {
368 for (uint8_t c = 0; c < wheelChannels; c++) {
369 float pw =
pws[c] / 8191.f;
372 pw =
pwFilters[c].process(deltaTime, pw);
376 float mod =
mods[c] / 127.f;
391 for (uint8_t c = 0; c <
channels; c++) {
419 for (uint8_t c = 0; c < MAX_CHANNELS; c++) {
436 for (uint8_t c = 0; c < MAX_CHANNELS; c++) {
519 for (uint8_t c = 0; c <
channels; c++) {
520 if (
notes[c] == note)
526 for (uint8_t i = 0; i <
channels; i++) {
540 for (uint8_t c = 0; c <
channels; c++) {
553 void pressNote(uint8_t note, uint8_t channel, uint8_t velocity) {
589 notes[channel] = note;
590 gates[channel] =
true;
609 for (uint8_t c = 0; c <
channels; c++) {
621 gates[channel] =
false;
659 for (uint8_t c = 0; c <
channels; c++) {
715 for (uint8_t c = 0; c < MAX_CHANNELS; c++) {
737 json_t* rootJ = json_object();
738 json_object_set_new(rootJ,
"channels", json_integer(
channels));
739 json_object_set_new(rootJ,
"monoMode", json_integer(
monoMode));
740 json_object_set_new(rootJ,
"retriggerOnResume", json_boolean(
retriggerOnResume));
741 json_object_set_new(rootJ,
"polyMode", json_integer(
polyMode));
743 json_object_set_new(rootJ,
"pwRange", json_real(
pwRange));
744 json_object_set_new(rootJ,
"smooth", json_boolean(
smooth));
745 json_object_set_new(rootJ,
"clockDivision", json_integer(
clockDivision));
750 json_object_set_new(rootJ,
"lastPw", json_integer(
pws[0]));
751 json_object_set_new(rootJ,
"lastMod", json_integer(
mods[0]));
754 json_object_set_new(rootJ,
"filterLambda", json_real(
pwFilters[0].lambda));
759 json_t* channelsJ = json_object_get(rootJ,
"channels");
763 json_t* monoModeJ = json_object_get(rootJ,
"monoMode");
767 json_t* retriggerOnResumeJ = json_object_get(rootJ,
"retriggerOnResume");
768 if (retriggerOnResumeJ)
771 json_t* polyModeJ = json_object_get(rootJ,
"polyMode");
775 json_t* releaseVelocityEnabledJ = json_object_get(rootJ,
"releaseVelocityEnabled");
776 if (releaseVelocityEnabledJ)
779 json_t* pwRangeJ = json_object_get(rootJ,
"pwRange");
781 pwRange = json_number_value(pwRangeJ);
783 json_t* smoothJ = json_object_get(rootJ,
"smooth");
785 smooth = json_boolean_value(smoothJ);
787 json_t* clockDivisionJ = json_object_get(rootJ,
"clockDivision");
791 json_t* lastPwJ = json_object_get(rootJ,
"lastPw");
793 pws[0] = json_integer_value(lastPwJ);
796 json_t* lastPitchJ = json_object_get(rootJ,
"lastPitch");
798 pws[0] = json_integer_value(lastPitchJ) - 8192;
800 json_t* lastModJ = json_object_get(rootJ,
"lastMod");
802 mods[0] = json_integer_value(lastModJ);
805 json_t* filterLambdaJ = json_object_get(rootJ,
"filterLambda");
Digital signal processing routines and classes.
Definition approx.hpp:6
TExponentialFilter ExponentialFilter
Definition filter.hpp:88
int clamp(int x, int a, int b)
Limits x between a and b.
Definition math.hpp:32
Root namespace for the Rack API.
Definition AudioDisplay.hpp:9
bool gates[CHANNELS]
Definition midi.hpp:22
void reset()
Definition midi.hpp:37
void setSustainPedal(int8_t cc)
Definition midi.hpp:166
void setChannelPressure(int8_t val)
Definition midi.hpp:124
void setContinue(bool cont)
Definition midi.hpp:213
void panic()
Definition midi.hpp:56
bool stop
Definition midi.hpp:29
bool cont
Definition midi.hpp:30
MidiGenerator()
Definition midi.hpp:33
void setPitchWheel(int16_t pw)
Definition midi.hpp:170
void setCc(int8_t cc, int id)
Definition midi.hpp:137
void setBalance(int8_t cc)
Definition midi.hpp:158
bool start
Definition midi.hpp:28
void setPan(int8_t cc)
Definition midi.hpp:162
int8_t notes[CHANNELS]
Definition midi.hpp:21
int16_t pw
Definition midi.hpp:26
void setNoteGate(int8_t note, bool gate, int c)
Definition midi.hpp:85
void setClock(bool clk)
Definition midi.hpp:183
void setFrame(int64_t frame)
Definition midi.hpp:243
void setVelocity(int8_t vel, int c)
Must be called before setNoteGate().
Definition midi.hpp:81
int8_t channelPressure
Definition midi.hpp:24
void setStop(bool stop)
Definition midi.hpp:228
bool clk
Definition midi.hpp:27
void setChannels(uint8_t channels)
Definition midi.hpp:70
void setVolume(int8_t cc)
Definition midi.hpp:154
void setKeyPressure(int8_t val, int c)
Definition midi.hpp:111
int8_t ccs[128]
Definition midi.hpp:25
void setModWheel(int8_t cc)
Definition midi.hpp:150
uint8_t channels
Definition midi.hpp:19
int8_t keyPressures[CHANNELS]
Definition midi.hpp:23
void setStart(bool start)
Definition midi.hpp:198
int64_t frame
Definition midi.hpp:31
int8_t vels[CHANNELS]
Definition midi.hpp:20
virtual void onMessage(const midi::Message &message)
Definition midi.hpp:247
dsp::PulseGenerator retriggerPulses[MAX_CHANNELS]
Definition midi.hpp:323
uint8_t velocities[MAX_CHANNELS]
Definition midi.hpp:305
bool smooth
Enables pitch-wheel and mod-wheel exponential smoothing.
Definition midi.hpp:290
void setFilterLambda(float lambda)
Sets exponential smoothing filter lambda speed.
Definition midi.hpp:714
void setChannels(uint8_t channels)
Definition midi.hpp:687
bool gates[MAX_CHANNELS]
Definition midi.hpp:304
uint8_t channels
Actual number of output polyphonic channels.
Definition midi.hpp:259
void releasePedal()
Definition midi.hpp:676
void releaseNote(uint8_t note, int8_t channel, int8_t velocity)
-1 velocity means unset.
Definition midi.hpp:596
dsp::PulseGenerator clockDividerPulse
Definition midi.hpp:322
float getPw(uint8_t channel)
Returns pitch wheel value, from -1 to 1.
Definition midi.hpp:722
dsp::PulseGenerator stopPulse
Definition midi.hpp:325
void pressNote(uint8_t note, uint8_t channel, uint8_t velocity)
Definition midi.hpp:553
uint8_t getWheelChannels()
Returns number of polyphonic channels for pitch and mod wheels.
Definition midi.hpp:732
dsp::ExponentialFilter pwFilters[MAX_CHANNELS]
Smoothing filters for wheel values.
Definition midi.hpp:318
void setPolyMode(PolyMode polyMode)
Definition midi.hpp:701
uint8_t assignChannel(uint8_t note)
Definition midi.hpp:513
PolyMode polyMode
Definition midi.hpp:281
void setMonoMode(MonoMode monoMode)
Definition midi.hpp:694
bool releaseVelocityEnabled
Set Velocity output from Note Off velocity.
Definition midi.hpp:284
uint8_t aftertouches[MAX_CHANNELS]
Definition midi.hpp:306
MonoMode monoMode
Definition midi.hpp:268
int64_t clock
Clock index from song start.
Definition midi.hpp:298
float getMod(uint8_t channel)
Returns mod wheel value, from 0 to 1.
Definition midi.hpp:727
float getPitchVoltage(uint8_t channel)
Definition midi.hpp:708
dsp::PulseGenerator startPulse
Definition midi.hpp:324
void panic()
Resets performance state.
Definition midi.hpp:348
std::vector< uint8_t > heldNotes
Definition midi.hpp:307
bool pedal
Whether sustain pedal is held.
Definition midi.hpp:301
void processFilters(float deltaTime)
Definition midi.hpp:366
MidiParser()
Definition midi.hpp:328
json_t * toJson()
Definition midi.hpp:736
float pwRange
Number of semitones to bend up/down by pitch wheel.
Definition midi.hpp:287
dsp::PulseGenerator clockPulse
Definition midi.hpp:321
uint8_t mods[MAX_CHANNELS]
Mod wheel values, from 0 to 127.
Definition midi.hpp:316
dsp::PulseGenerator continuePulse
Definition midi.hpp:326
int16_t pws[MAX_CHANNELS]
Pitch wheel values, from -8192 to 8191.
Definition midi.hpp:313
uint32_t clockDivision
Number of 24 PPQN clocks between clock divider pulses.
Definition midi.hpp:293
MonoMode
Definition midi.hpp:261
@ NUM_MONO_MODES
Definition midi.hpp:266
@ FIRST_PRIORITY_MODE
Definition midi.hpp:263
@ HIGHEST_PRIORITY_MODE
Definition midi.hpp:265
@ LOWEST_PRIORITY_MODE
Definition midi.hpp:264
@ LAST_PRIORITY_MODE
Definition midi.hpp:262
void pressPedal()
Definition midi.hpp:670
int8_t rotateIndex
Definition midi.hpp:308
dsp::ExponentialFilter modFilters[MAX_CHANNELS]
Definition midi.hpp:319
uint8_t notes[MAX_CHANNELS]
Definition midi.hpp:303
void refreshHeld()
Deactivates all notes that are not held, and reactivates notes that are.
Definition midi.hpp:630
PolyMode
Method for assigning notes to polyphony channels.
Definition midi.hpp:274
@ ROTATE_MODE
Definition midi.hpp:275
@ REUSE_MODE
Definition midi.hpp:276
@ RESET_MODE
Definition midi.hpp:277
@ NUM_POLY_MODES
Definition midi.hpp:279
@ MPE_MODE
Definition midi.hpp:278
void processCC(const midi::Message &msg)
Definition midi.hpp:457
void processMessage(const midi::Message &msg)
Definition midi.hpp:396
void reset()
Resets settings and performance state.
Definition midi.hpp:334
void processPulses(float deltaTime)
Definition midi.hpp:385
void fromJson(json_t *rootJ)
Definition midi.hpp:758
void processSystem(const midi::Message &msg)
Definition midi.hpp:481
bool retriggerOnResume
In monophonic mode, generate Retrigger pulse when the active note is released and another takes over.
Definition midi.hpp:271
uint8_t getChannels()
Definition midi.hpp:683
When triggered, holds a high value for a specified time before going low again.
Definition digital.hpp:167
void setSize(int size)
Definition midi.hpp:31
void setFrame(int64_t frame)
Definition midi.hpp:85
void setValue(uint8_t value)
Definition midi.hpp:73
void setStatus(uint8_t status)
Definition midi.hpp:51
uint8_t getNote() const
Definition midi.hpp:57
void setNote(uint8_t note)
Definition midi.hpp:62
void setChannel(uint8_t channel)
Definition midi.hpp:40
uint8_t getChannel() const
Definition midi.hpp:35
uint8_t getStatus() const
Definition midi.hpp:46
uint8_t getValue() const
Definition midi.hpp:68