Subversion Repositories svn.mios32

Rev

Rev 1917 | Rev 2438 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1917 Rev 1960
Line 1... Line 1...
1
/* -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*- */
1
/* -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*- */
2
// $Id: MbCv.cpp 1917 2014-01-06 11:34:52Z tk $
2
// $Id: MbCv.cpp 1960 2014-02-09 20:21:24Z tk $
3
/*
3
/*
4
 * MIDIbox CV Unit
4
 * MIDIbox CV Unit
5
 *
5
 *
6
 * ==========================================================================
6
 * ==========================================================================
7
 *
7
 *
Line 44... Line 44...
44
44
45
    mbCvClockPtr = _mbCvClockPtr;
45
    mbCvClockPtr = _mbCvClockPtr;
46
    mbCvVoice.init(_cvNum, &mbCvMidiVoice);
46
    mbCvVoice.init(_cvNum, &mbCvMidiVoice);
47
    mbCvMidiVoice.init();
47
    mbCvMidiVoice.init();
48
    mbCvMod.init(_cvNum);
48
    mbCvMod.init(_cvNum);
-
 
49
    lastExternalGateValue = 0;
49
50
50
    updatePatch(true);
51
    updatePatch(true);
51
}
52
}
52
53
53
54
54
/////////////////////////////////////////////////////////////////////////////
55
/////////////////////////////////////////////////////////////////////////////
55
// Sound Engine Update Cycle
56
// Sound Engine Update Cycle
56
/////////////////////////////////////////////////////////////////////////////
57
/////////////////////////////////////////////////////////////////////////////
57
bool MbCv::tick(const u8 &updateSpeedFactor)
58
bool MbCv::tick(const u8 &updateSpeedFactor)
58
{
59
{
-
 
60
    // external trigger
-
 
61
    {
-
 
62
        u16 ainValue = MIOS32_AIN_PinGet(cvNum); // 12bit
-
 
63
        u16 threshold = mbCvVoice.voiceExternalGateThreshold << 4; // 8bit -> 12bit
-
 
64
        if( threshold ) {
-
 
65
            if( lastExternalGateValue < threshold && ainValue >= threshold ) {
-
 
66
                mbCvVoice.gateOn();
-
 
67
                triggerNoteOn(&mbCvVoice);
-
 
68
            } else if( lastExternalGateValue >= threshold && ainValue < threshold ) {
-
 
69
                mbCvVoice.gateOff(mbCvVoice.voicePlayedNote);
-
 
70
                triggerNoteOff(&mbCvVoice);
-
 
71
            }
-
 
72
        }
-
 
73
        lastExternalGateValue = ainValue;
-
 
74
    }
-
 
75
59
    // clock
76
    // clock
60
    if( mbCvClockPtr->eventStart ) {
77
    if( mbCvClockPtr->eventStart ) {
61
        mbCvSeqBassline.seqRestartReq = true;
78
        mbCvSeqBassline.seqRestartReq = true;
62
    }
79
    }
63
80
Line 82... Line 99...
82
            l->lfoRateModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_LFO1_R + lfo);
99
            l->lfoRateModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_LFO1_R + lfo);
83
100
84
            if( l->tick(updateSpeedFactor) ) {
101
            if( l->tick(updateSpeedFactor) ) {
85
                // trigger[MBCV_TRG_L1P+lfo];
102
                // trigger[MBCV_TRG_L1P+lfo];
86
            }
103
            }
87
-
 
88
            mbCvMod.modSrc[MBCV_MOD_SRC_LFO1 + lfo] = l->lfoOut;
-
 
89
        }
104
        }
90
    }
105
    }
91
106
92
    // ENVs
107
    // ENVs
93
    {
108
    {
Line 100... Line 115...
100
            e->envRateModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_ENV1_R);
115
            e->envRateModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_ENV1_R);
101
116
102
            if( e->tick(updateSpeedFactor) ) {
117
            if( e->tick(updateSpeedFactor) ) {
103
                // trigger[MBCV_TRG_E1S];
118
                // trigger[MBCV_TRG_E1S];
104
            }
119
            }
105
-
 
106
            mbCvMod.modSrc[MBCV_MOD_SRC_ENV1] = e->envOut;
-
 
107
        }
120
        }
108
    }
121
    }
109
122
110
    {
123
    {
111
        MbCvEnvMulti *e = mbCvEnv2.first();
124
        MbCvEnvMulti *e = mbCvEnv2.first();
Line 117... Line 130...
117
            e->envRateModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_ENV2_R);
130
            e->envRateModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_ENV2_R);
118
131
119
            if( e->tick(updateSpeedFactor) ) {
132
            if( e->tick(updateSpeedFactor) ) {
120
                // trigger[MBCV_TRG_E2S];
133
                // trigger[MBCV_TRG_E2S];
121
            }
134
            }
122
-
 
123
            mbCvMod.modSrc[MBCV_MOD_SRC_ENV2] = e->envOut;
-
 
124
        }
135
        }
125
    }
136
    }
126
137
127
    // Modulation Matrix
138
    // Modulation Matrix
128
    {
139
    {
129
        // since this isn't done anywhere else:
-
 
130
        // convert linear frequency of voice1 to 15bit signed value (only positive direction)
-
 
131
        mbCvMod.modSrc[MBCV_MOD_SRC_KEY] = mbCvVoice.voiceLinearFrq >> 1;
-
 
132
-
 
133
        // do ModMatrix calculations
140
        // do ModMatrix calculations
134
        mbCvMod.tick();
141
        mbCvMod.tick();
135
142
136
        // additional direct modulation paths
143
        // additional direct modulation paths
-
 
144
        {
-
 
145
            s32 lfo1Value = (s32)mbCvLfo[0].lfoOut;
-
 
146
            s32 lfo2Value = (s32)mbCvLfo[1].lfoOut;
-
 
147
            s32 env1Value = (s32)mbCvEnv1[0].envOut;
-
 
148
            s32 env2Value = (s32)mbCvEnv2[0].envOut;
-
 
149
137
        { // Pitch
150
            { // Pitch
138
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_PITCH];
151
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_CV];
139
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO1] * (s32)mbCvLfo[0].lfoDepthPitch) / 128;
152
                mod += (lfo1Value * (s32)mbCvLfo[0].lfoDepthPitch) / 128;
140
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO2] * (s32)mbCvLfo[1].lfoDepthPitch) / 128;
153
                mod += (lfo2Value * (s32)mbCvLfo[1].lfoDepthPitch) / 128;
141
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV1] * (s32)mbCvEnv1[0].envDepthPitch) / 128;
154
                mod += (env1Value * (s32)mbCvEnv1[0].envDepthPitch) / 128;
142
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV2] * (s32)mbCvEnv2[0].envDepthPitch) / 128;
155
                mod += (env1Value * (s32)mbCvEnv2[0].envDepthPitch) / 128;
143
            mbCvMod.modDst[MBCV_MOD_DST_PITCH] = mod;
156
                mbCvMod.modDst[MBCV_MOD_DST_CV] = mod;
144
        }
157
            }
145
158
146
        { // LFO1 Amp
159
            { // LFO1 Amp
147
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO1_A];
160
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO1_A];
148
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO2] * (s32)mbCvLfo[1].lfoDepthLfoAmplitude) / 128;
161
                mod += (lfo2Value * (s32)mbCvLfo[1].lfoDepthLfoAmplitude) / 128;
149
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV1] * (s32)mbCvEnv1[0].envDepthLfo1Amplitude) / 128;
162
                mod += (env1Value * (s32)mbCvEnv1[0].envDepthLfo1Amplitude) / 128;
150
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV2] * (s32)mbCvEnv2[0].envDepthLfo1Amplitude) / 128;
163
                mod += (env2Value * (s32)mbCvEnv2[0].envDepthLfo1Amplitude) / 128;
151
            mbCvMod.modDst[MBCV_MOD_DST_LFO1_A] = mod;
164
                mbCvMod.modDst[MBCV_MOD_DST_LFO1_A] = mod;
152
        }
165
            }
153
166
154
        { // LFO2 Amp
167
            { // LFO2 Amp
155
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO2_A];
168
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO2_A];
156
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO1] * (s32)mbCvLfo[0].lfoDepthLfoAmplitude) / 128;
169
                mod += (lfo1Value * (s32)mbCvLfo[0].lfoDepthLfoAmplitude) / 128;
157
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV1] * (s32)mbCvEnv1[0].envDepthLfo2Amplitude) / 128;
170
                mod += (env1Value * (s32)mbCvEnv1[0].envDepthLfo2Amplitude) / 128;
158
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV2] * (s32)mbCvEnv2[0].envDepthLfo2Amplitude) / 128;
171
                mod += (env2Value * (s32)mbCvEnv2[0].envDepthLfo2Amplitude) / 128;
159
            mbCvMod.modDst[MBCV_MOD_DST_LFO2_A] = mod;
172
                mbCvMod.modDst[MBCV_MOD_DST_LFO2_A] = mod;
160
        }
173
            }
161
174
162
        { // LFO1 Rate
175
            { // LFO1 Rate
163
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO1_R];
176
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO1_R];
164
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO2] * (s32)mbCvLfo[1].lfoDepthLfoRate) / 128;
177
                mod += (lfo2Value * (s32)mbCvLfo[1].lfoDepthLfoRate) / 128;
165
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV1] * (s32)mbCvEnv1[0].envDepthLfo1Rate) / 128;
178
                mod += (env1Value * (s32)mbCvEnv1[0].envDepthLfo1Rate) / 128;
166
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV2] * (s32)mbCvEnv2[0].envDepthLfo1Rate) / 128;
179
                mod += (env2Value * (s32)mbCvEnv2[0].envDepthLfo1Rate) / 128;
167
            mbCvMod.modDst[MBCV_MOD_DST_LFO1_R] = mod;
180
                mbCvMod.modDst[MBCV_MOD_DST_LFO1_R] = mod;
168
        }
181
            }
169
182
170
        { // LFO2 Rate
183
            { // LFO2 Rate
171
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO2_R];
184
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_LFO2_R];
172
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO1] * (s32)mbCvLfo[0].lfoDepthLfoRate) / 128;
185
                mod += (lfo1Value * (s32)mbCvLfo[0].lfoDepthLfoRate) / 128;
173
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV1] * (s32)mbCvEnv1[0].envDepthLfo2Rate) / 128;
186
                mod += (env1Value * (s32)mbCvEnv1[0].envDepthLfo2Rate) / 128;
174
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_ENV2] * (s32)mbCvEnv2[0].envDepthLfo2Rate) / 128;
187
                mod += (env2Value * (s32)mbCvEnv2[0].envDepthLfo2Rate) / 128;
175
            mbCvMod.modDst[MBCV_MOD_DST_LFO2_R] = mod;
188
                mbCvMod.modDst[MBCV_MOD_DST_LFO2_R] = mod;
176
        }
189
            }
177
190
178
        { // ENV1 Rate
191
            { // ENV1 Rate
179
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_ENV1_R];
192
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_ENV1_R];
180
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO1] * (s32)mbCvLfo[0].lfoDepthEnv1Rate) / 128;
193
                mod += (lfo1Value * (s32)mbCvLfo[0].lfoDepthEnv1Rate) / 128;
181
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO2] * (s32)mbCvLfo[1].lfoDepthEnv1Rate) / 128;
194
                mod += (lfo2Value * (s32)mbCvLfo[1].lfoDepthEnv1Rate) / 128;
182
            mbCvMod.modDst[MBCV_MOD_DST_ENV1_R] = mod;
195
                mbCvMod.modDst[MBCV_MOD_DST_ENV1_R] = mod;
183
        }
196
            }
184
197
185
        { // ENV2 Rate
198
            { // ENV2 Rate
186
            s32 mod = mbCvMod.modDst[MBCV_MOD_DST_ENV2_R];
199
                s32 mod = mbCvMod.modDst[MBCV_MOD_DST_ENV2_R];
187
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO1] * (s32)mbCvLfo[0].lfoDepthEnv2Rate) / 128;
200
                mod += (lfo1Value * (s32)mbCvLfo[0].lfoDepthEnv2Rate) / 128;
188
            mod += ((s32)mbCvMod.modSrc[MBCV_MOD_SRC_LFO2] * (s32)mbCvLfo[1].lfoDepthEnv2Rate) / 128;
201
                mod += (lfo2Value * (s32)mbCvLfo[1].lfoDepthEnv2Rate) / 128;
189
            mbCvMod.modDst[MBCV_MOD_DST_ENV2_R] = mod;
202
                mbCvMod.modDst[MBCV_MOD_DST_ENV2_R] = mod;
-
 
203
            }
190
        }
204
        }
191
    }
205
    }
192
206
193
    {
207
    {
194
        // Voice handling
208
        // Voice handling
195
        MbCvVoice *v = &mbCvVoice; // allows to use multiple voices later
209
        MbCvVoice *v = &mbCvVoice; // allows to use multiple voices later
196
210
197
        v->voicePitchModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_PITCH);
211
        v->voicePitchModulation = mbCvMod.takeDstValue(MBCV_MOD_DST_CV);
198
212
199
        if( mbCvArp.arpEnabled ) {
213
        if( mbCvArp.arpEnabled ) {
200
            mbCvArp.tick(v, this);
214
            mbCvArp.tick(v, this);
201
            mbCvMod.modSrc[MBCV_MOD_SRC_SEQ_ENVMOD] = mbCvSeqBassline.seqEnvMod << 7; // just pass current value
-
 
202
            mbCvMod.modSrc[MBCV_MOD_SRC_SEQ_ACCENT] = mbCvSeqBassline.seqAccent << 7; // just pass current value (not effective value)
-
 
203
        } else {
215
        } else {
204
            mbCvSeqBassline.tick(v, this);
216
            mbCvSeqBassline.tick(v, this);
205
            mbCvMod.modSrc[MBCV_MOD_SRC_SEQ_ENVMOD] = mbCvSeqBassline.seqEnvMod << 7;
-
 
206
            mbCvMod.modSrc[MBCV_MOD_SRC_SEQ_ACCENT] = mbCvSeqBassline.seqAccentEffective << 7; // effective value is only != 0 when accent flag is set
-
 
207
        }
217
        }
208
218
209
        if( v->gate(updateSpeedFactor) )
219
        if( v->gate(updateSpeedFactor) )
210
            v->pitch(updateSpeedFactor);
220
            v->pitch(updateSpeedFactor);
211
    }
221
    }
Line 263... Line 273...
263
    // operation must be atomic!
273
    // operation must be atomic!
264
    MIOS32_IRQ_Disable();
274
    MIOS32_IRQ_Disable();
265
275
266
    // set note on/off
276
    // set note on/off
267
    if( velocity ) {
277
    if( velocity ) {
268
        mbCvMod.modSrc[MBCV_MOD_SRC_VEL] = velocity << 8;
-
 
269
        noteOn(note, velocity, false);
278
        noteOn(note, velocity, false);
270
    } else
279
    } else
271
        noteOff(note, false);
280
        noteOff(note, false);
272
281
273
    MIOS32_IRQ_Enable();
282
    MIOS32_IRQ_Enable();
Line 280... Line 289...
280
void MbCv::midiReceiveCC(u8 chn, u8 ccNumber, u8 value)
289
void MbCv::midiReceiveCC(u8 chn, u8 ccNumber, u8 value)
281
{
290
{
282
    // take over CC (valid CCs will be checked by MIDI voice)
291
    // take over CC (valid CCs will be checked by MIDI voice)
283
    if( mbCvMidiVoice.isAssigned(chn) ) {
292
    if( mbCvMidiVoice.isAssigned(chn) ) {
284
        if( ccNumber == 1 )
293
        if( ccNumber == 1 )
285
            mbCvMod.modSrc[MBCV_MOD_SRC_MDW] = value << 8;
294
            mbCvMidiVoice.midivoiceModWheel = value;
286
295
287
        mbCvMidiVoice.setCC(ccNumber, value);
296
        mbCvMidiVoice.setCC(ccNumber, value);
288
    }
297
    }
289
}
298
}
290
299
Line 294... Line 303...
294
/////////////////////////////////////////////////////////////////////////////
303
/////////////////////////////////////////////////////////////////////////////
295
void MbCv::midiReceivePitchBend(u8 chn, u16 pitchbendValue14bit)
304
void MbCv::midiReceivePitchBend(u8 chn, u16 pitchbendValue14bit)
296
{
305
{
297
    if( mbCvMidiVoice.isAssigned(chn) ) {
306
    if( mbCvMidiVoice.isAssigned(chn) ) {
298
        s16 pitchbendValueSigned = (s16)pitchbendValue14bit - 8192;
307
        s16 pitchbendValueSigned = (s16)pitchbendValue14bit - 8192;
299
        mbCvMidiVoice.midivoicePitchbender = pitchbendValueSigned;
308
        mbCvMidiVoice.midivoicePitchBender = pitchbendValueSigned;
300
-
 
301
        mbCvMod.modSrc[MBCV_MOD_SRC_PBN] = 2*pitchbendValueSigned;
-
 
302
    }
309
    }
303
}
310
}
304
311
305
312
306
/////////////////////////////////////////////////////////////////////////////
313
/////////////////////////////////////////////////////////////////////////////
307
// Receives an Aftertouch Event
314
// Receives an Aftertouch Event
308
/////////////////////////////////////////////////////////////////////////////
315
/////////////////////////////////////////////////////////////////////////////
309
void MbCv::midiReceiveAftertouch(u8 chn, u8 value)
316
void MbCv::midiReceiveAftertouch(u8 chn, u8 value)
310
{
317
{
311
    if( mbCvMidiVoice.isAssigned(chn) ) {
318
    if( mbCvMidiVoice.isAssigned(chn) ) {
312
        mbCvMidiVoice.midivoiceAftertouch = value << 8;
319
        mbCvMidiVoice.midivoiceAftertouch = value;
313
        mbCvMod.modSrc[MBCV_MOD_SRC_ATH] = value;
-
 
314
    }
320
    }
315
}
321
}
316
322
317
323
318
/////////////////////////////////////////////////////////////////////////////
324
/////////////////////////////////////////////////////////////////////////////
Line 516... Line 522...
516
CREATE_ACCESS_FUNCTIONS(MidiVoice, GateInverted,       "Inv. Gate",       *value = cv->mbCvVoice.voiceGateInverted,                cv->mbCvVoice.voiceGateInverted = value);
522
CREATE_ACCESS_FUNCTIONS(MidiVoice, GateInverted,       "Inv. Gate",       *value = cv->mbCvVoice.voiceGateInverted,                cv->mbCvVoice.voiceGateInverted = value);
517
CREATE_ACCESS_FUNCTIONS(MidiVoice, Legato,             "Legato",          *value = cv->mbCvVoice.voiceLegato,                      cv->mbCvVoice.voiceLegato = value);
523
CREATE_ACCESS_FUNCTIONS(MidiVoice, Legato,             "Legato",          *value = cv->mbCvVoice.voiceLegato,                      cv->mbCvVoice.voiceLegato = value);
518
CREATE_ACCESS_FUNCTIONS(MidiVoice, Poly,               "Poly",            *value = cv->mbCvVoice.voicePoly,                        cv->mbCvVoice.voicePoly = value);
524
CREATE_ACCESS_FUNCTIONS(MidiVoice, Poly,               "Poly",            *value = cv->mbCvVoice.voicePoly,                        cv->mbCvVoice.voicePoly = value);
519
CREATE_ACCESS_FUNCTIONS(MidiVoice, SusKey,             "SusKey",          *value = cv->mbCvVoice.voiceSusKey,                      cv->mbCvVoice.voiceSusKey = value);
525
CREATE_ACCESS_FUNCTIONS(MidiVoice, SusKey,             "SusKey",          *value = cv->mbCvVoice.voiceSusKey,                      cv->mbCvVoice.voiceSusKey = value);
520
CREATE_ACCESS_FUNCTIONS(MidiVoice, PortamentoMode,     "PortamentoMode",  *value = cv->mbCvVoice.getPortamentoMode(),              cv->mbCvVoice.setPortamentoMode(value));
526
CREATE_ACCESS_FUNCTIONS(MidiVoice, PortamentoMode,     "PortamentoMode",  *value = cv->mbCvVoice.getPortamentoMode(),              cv->mbCvVoice.setPortamentoMode(value));
-
 
527
CREATE_ACCESS_FUNCTIONS(MidiVoice, ForceToScale,       "ForceToScale",    *value = cv->mbCvVoice.voiceForceToScale,                cv->mbCvVoice.voiceForceToScale = value);
-
 
528
CREATE_ACCESS_FUNCTIONS(MidiVoice, ExtGateThrs,        "ExtGateThrs",     *value = cv->mbCvVoice.voiceExternalGateThreshold,    cv->mbCvVoice.voiceExternalGateThreshold = value);
521
CREATE_ACCESS_FUNCTIONS(MidiVoice, PitchRange,         "Pitch Range",     *value = cv->mbCvVoice.voicePitchrange,                  cv->mbCvVoice.voicePitchrange = value);
529
CREATE_ACCESS_FUNCTIONS(MidiVoice, PitchRange,         "Pitch Range",     *value = cv->mbCvVoice.voicePitchrange,                  cv->mbCvVoice.voicePitchrange = value);
522
CREATE_ACCESS_FUNCTIONS(MidiVoice, Ketrack,            "Keytrack",        *value = (int)cv->mbCvVoice.voiceKeytrack + 0x80,        cv->mbCvVoice.voiceKeytrack = (int)value - 0x80);
530
CREATE_ACCESS_FUNCTIONS(MidiVoice, Ketrack,            "Keytrack",        *value = (int)cv->mbCvVoice.voiceKeytrack + 0x80,        cv->mbCvVoice.voiceKeytrack = (int)value - 0x80);
523
CREATE_ACCESS_FUNCTIONS(MidiVoice, TransposeOctave,    "Transp. Octave",  *value = (int)cv->mbCvVoice.voiceTransposeOctave + 8,    cv->mbCvVoice.voiceTransposeOctave = (int)value - 8);
531
CREATE_ACCESS_FUNCTIONS(MidiVoice, TransposeOctave,    "Transp. Octave",  *value = (int)cv->mbCvVoice.voiceTransposeOctave + 8,    cv->mbCvVoice.voiceTransposeOctave = (int)value - 8);
524
CREATE_ACCESS_FUNCTIONS(MidiVoice, TransposeSemitone,  "Transp. Semi.",   *value = (int)cv->mbCvVoice.voiceTransposeSemitone + 8,  cv->mbCvVoice.voiceTransposeSemitone = (int)value - 8);
532
CREATE_ACCESS_FUNCTIONS(MidiVoice, TransposeSemitone,  "Transp. Semi.",   *value = (int)cv->mbCvVoice.voiceTransposeSemitone + 8,  cv->mbCvVoice.voiceTransposeSemitone = (int)value - 8);
525
CREATE_ACCESS_FUNCTIONS(MidiVoice, Finetune,           "Finetune",        *value = (int)cv->mbCvVoice.voiceFinetune + 0x80,        cv->mbCvVoice.voiceFinetune = (int)value - 0x80);
533
CREATE_ACCESS_FUNCTIONS(MidiVoice, Finetune,           "Finetune",        *value = (int)cv->mbCvVoice.voiceFinetune + 0x80,        cv->mbCvVoice.voiceFinetune = (int)value - 0x80);
Line 564... Line 572...
564
CREATE_ACCESS_FUNCTIONS(Lfo, DepthEnv1Rate,            "Depth ENV1 Rate", *value = (int)cv->mbCvLfo[arg].lfoDepthEnv1Rate + 0x80,     cv->mbCvLfo[arg].lfoDepthEnv1Rate = (int)value - 0x80);
572
CREATE_ACCESS_FUNCTIONS(Lfo, DepthEnv1Rate,            "Depth ENV1 Rate", *value = (int)cv->mbCvLfo[arg].lfoDepthEnv1Rate + 0x80,     cv->mbCvLfo[arg].lfoDepthEnv1Rate = (int)value - 0x80);
565
CREATE_ACCESS_FUNCTIONS(Lfo, DepthEnv2Rate,            "Depth ENV2 Rate", *value = (int)cv->mbCvLfo[arg].lfoDepthEnv2Rate + 0x80,     cv->mbCvLfo[arg].lfoDepthEnv2Rate = (int)value - 0x80);
573
CREATE_ACCESS_FUNCTIONS(Lfo, DepthEnv2Rate,            "Depth ENV2 Rate", *value = (int)cv->mbCvLfo[arg].lfoDepthEnv2Rate + 0x80,     cv->mbCvLfo[arg].lfoDepthEnv2Rate = (int)value - 0x80);
566
574
567
CREATE_GROUP(Env1, "ENV1");
575
CREATE_GROUP(Env1, "ENV1");
568
CREATE_ACCESS_FUNCTIONS(Env1, Amplitude,               "Amplitude",       *value = (int)cv->mbCvEnv1[arg].envAmplitude + 0x80,          cv->mbCvEnv1[arg].envAmplitude = (int)value - 0x80);
576
CREATE_ACCESS_FUNCTIONS(Env1, Amplitude,               "Amplitude",       *value = (int)cv->mbCvEnv1[arg].envAmplitude + 0x80,          cv->mbCvEnv1[arg].envAmplitude = (int)value - 0x80);
-
 
577
CREATE_ACCESS_FUNCTIONS(Env1, CurvePos,                "CurvePos",        *value = (int)cv->mbCvEnv1[arg].envCurvePos,                  cv->mbCvEnv1[arg].envCurvePos = (int)value);
569
CREATE_ACCESS_FUNCTIONS(Env1, Curve,                   "Curve",           *value = (int)cv->mbCvEnv1[arg].envCurve,                     cv->mbCvEnv1[arg].envCurve = (int)value);
578
CREATE_ACCESS_FUNCTIONS(Env1, CurveNeg,                "CurveNeg",        *value = (int)cv->mbCvEnv1[arg].envCurveNeg,                  cv->mbCvEnv1[arg].envCurveNeg = (int)value);
570
CREATE_ACCESS_FUNCTIONS(Env1, Delay,                   "Delay",           *value = (int)cv->mbCvEnv1[arg].envDelay,                     cv->mbCvEnv1[arg].envDelay = (int)value);
579
CREATE_ACCESS_FUNCTIONS(Env1, Delay,                   "Delay",           *value = (int)cv->mbCvEnv1[arg].envDelay,                     cv->mbCvEnv1[arg].envDelay = (int)value);
571
CREATE_ACCESS_FUNCTIONS(Env1, Attack,                  "Attack",          *value = (int)cv->mbCvEnv1[arg].envAttack,                    cv->mbCvEnv1[arg].envAttack = (int)value);
580
CREATE_ACCESS_FUNCTIONS(Env1, Attack,                  "Attack",          *value = (int)cv->mbCvEnv1[arg].envAttack,                    cv->mbCvEnv1[arg].envAttack = (int)value);
572
CREATE_ACCESS_FUNCTIONS(Env1, Decay,                   "Decay",           *value = (int)cv->mbCvEnv1[arg].envDecay,                     cv->mbCvEnv1[arg].envDecay = (int)value);
581
CREATE_ACCESS_FUNCTIONS(Env1, Decay,                   "Decay",           *value = (int)cv->mbCvEnv1[arg].envDecay,                     cv->mbCvEnv1[arg].envDecay = (int)value);
573
CREATE_ACCESS_FUNCTIONS(Env1, Sustain,                 "Sustain",         *value = (int)cv->mbCvEnv1[arg].envSustain,                   cv->mbCvEnv1[arg].envSustain = (int)value);
582
CREATE_ACCESS_FUNCTIONS(Env1, Sustain,                 "Sustain",         *value = (int)cv->mbCvEnv1[arg].envSustain,                   cv->mbCvEnv1[arg].envSustain = (int)value);
574
CREATE_ACCESS_FUNCTIONS(Env1, Release,                 "Release",         *value = (int)cv->mbCvEnv1[arg].envRelease,                   cv->mbCvEnv1[arg].envRelease = (int)value);
583
CREATE_ACCESS_FUNCTIONS(Env1, Release,                 "Release",         *value = (int)cv->mbCvEnv1[arg].envRelease,                   cv->mbCvEnv1[arg].envRelease = (int)value);
Line 582... Line 591...
582
CREATE_ACCESS_FUNCTIONS(Env1, DepthLfo2Amplitude,      "Depth LFO2 Amp.", *value = (int)cv->mbCvEnv1[arg].envDepthLfo2Amplitude + 0x80, cv->mbCvEnv1[arg].envDepthLfo2Amplitude = (int)value - 0x80);
591
CREATE_ACCESS_FUNCTIONS(Env1, DepthLfo2Amplitude,      "Depth LFO2 Amp.", *value = (int)cv->mbCvEnv1[arg].envDepthLfo2Amplitude + 0x80, cv->mbCvEnv1[arg].envDepthLfo2Amplitude = (int)value - 0x80);
583
CREATE_ACCESS_FUNCTIONS(Env1, DepthLfo2Rate,           "Depth LFO2 Rate", *value = (int)cv->mbCvEnv1[arg].envDepthLfo2Rate + 0x80,      cv->mbCvEnv1[arg].envDepthLfo2Rate = (int)value - 0x80);
592
CREATE_ACCESS_FUNCTIONS(Env1, DepthLfo2Rate,           "Depth LFO2 Rate", *value = (int)cv->mbCvEnv1[arg].envDepthLfo2Rate + 0x80,      cv->mbCvEnv1[arg].envDepthLfo2Rate = (int)value - 0x80);
584
593
585
CREATE_GROUP(Env2, "ENV2");
594
CREATE_GROUP(Env2, "ENV2");
586
CREATE_ACCESS_FUNCTIONS(Env2, Amplitude,               "Amplitude",       *value = (int)cv->mbCvEnv2[arg].envAmplitude + 0x80,          cv->mbCvEnv2[arg].envAmplitude = (int)value - 0x80);
595
CREATE_ACCESS_FUNCTIONS(Env2, Amplitude,               "Amplitude",       *value = (int)cv->mbCvEnv2[arg].envAmplitude + 0x80,          cv->mbCvEnv2[arg].envAmplitude = (int)value - 0x80);
-
 
596
CREATE_ACCESS_FUNCTIONS(Env2, CurvePos,                "CurvePos",        *value = (int)cv->mbCvEnv2[arg].envCurvePos,                  cv->mbCvEnv2[arg].envCurvePos = (int)value);
587
CREATE_ACCESS_FUNCTIONS(Env2, Curve,                   "Curve",           *value = (int)cv->mbCvEnv2[arg].envCurve,                     cv->mbCvEnv2[arg].envCurve = (int)value);
597
CREATE_ACCESS_FUNCTIONS(Env2, CurveNeg,                "CurveNeg",        *value = (int)cv->mbCvEnv2[arg].envCurveNeg,                  cv->mbCvEnv2[arg].envCurveNeg = (int)value);
588
CREATE_ACCESS_FUNCTIONS(Env2, Offset,                  "Offset",          *value = (int)cv->mbCvEnv2[arg].envOffset,                    cv->mbCvEnv2[arg].envOffset = (int)value);
598
CREATE_ACCESS_FUNCTIONS(Env2, Offset,                  "Offset",          *value = (int)cv->mbCvEnv2[arg].envOffset,                    cv->mbCvEnv2[arg].envOffset = (int)value);
589
CREATE_ACCESS_FUNCTIONS(Env2, Rate,                    "Rate",            *value = (int)cv->mbCvEnv2[arg].envRate,                      cv->mbCvEnv2[arg].envRate = (int)value);
599
CREATE_ACCESS_FUNCTIONS(Env2, Rate,                    "Rate",            *value = (int)cv->mbCvEnv2[arg].envRate,                      cv->mbCvEnv2[arg].envRate = (int)value);
590
CREATE_ACCESS_FUNCTIONS(Env2, LoopAttack,              "Loop Attack",     *value = (int)cv->mbCvEnv2[arg].envLoopAttack,                cv->mbCvEnv2[arg].envLoopAttack = (int)value);
600
CREATE_ACCESS_FUNCTIONS(Env2, LoopAttack,              "Loop Attack",     *value = (int)cv->mbCvEnv2[arg].envLoopAttack,                cv->mbCvEnv2[arg].envLoopAttack = (int)value);
591
CREATE_ACCESS_FUNCTIONS(Env2, SustainStep,             "Sustain Step",    *value = (int)cv->mbCvEnv2[arg].envSustainStep,               cv->mbCvEnv2[arg].envSustainStep = (int)value);
601
CREATE_ACCESS_FUNCTIONS(Env2, SustainStep,             "Sustain Step",    *value = (int)cv->mbCvEnv2[arg].envSustainStep,               cv->mbCvEnv2[arg].envSustainStep = (int)value);
592
CREATE_ACCESS_FUNCTIONS(Env2, LoopRelease,             "Loop Release",    *value = (int)cv->mbCvEnv2[arg].envLoopRelease,               cv->mbCvEnv2[arg].envLoopRelease = (int)value);
602
CREATE_ACCESS_FUNCTIONS(Env2, LoopRelease,             "Loop Release",    *value = (int)cv->mbCvEnv2[arg].envLoopRelease,               cv->mbCvEnv2[arg].envLoopRelease = (int)value);
Line 602... Line 612...
602
CREATE_ACCESS_FUNCTIONS(Env2, DepthLfo2Rate,           "Depth LFO2 Rate", *value = (int)cv->mbCvEnv2[arg].envDepthLfo2Rate + 0x80,      cv->mbCvEnv2[arg].envDepthLfo2Rate = (int)value - 0x80);
612
CREATE_ACCESS_FUNCTIONS(Env2, DepthLfo2Rate,           "Depth LFO2 Rate", *value = (int)cv->mbCvEnv2[arg].envDepthLfo2Rate + 0x80,      cv->mbCvEnv2[arg].envDepthLfo2Rate = (int)value - 0x80);
603
CREATE_ACCESS_FUNCTIONS(Env2, Level,                   "Level Step #%2d", *value = cv->mbCvEnv2[0].envLevel[arg],                       cv->mbCvEnv2[0].envLevel[arg] = value); // TODO: take ENV index into MSBs of arg?
613
CREATE_ACCESS_FUNCTIONS(Env2, Level,                   "Level Step #%2d", *value = cv->mbCvEnv2[0].envLevel[arg],                       cv->mbCvEnv2[0].envLevel[arg] = value); // TODO: take ENV index into MSBs of arg?
604
614
605
CREATE_GROUP(Mod, "Mod%d");
615
CREATE_GROUP(Mod, "Mod%d");
606
CREATE_ACCESS_FUNCTIONS(Mod, Depth,                    "Depth",           *value = cv->mbCvMod.modPatch[arg].depth + 0x80,              cv->mbCvMod.modPatch[arg].depth = (int)value - 0x80);
616
CREATE_ACCESS_FUNCTIONS(Mod, Depth,                    "Depth",           *value = cv->mbCvMod.modPatch[arg].depth + 0x80,              cv->mbCvMod.modPatch[arg].depth = (int)value - 0x80);
-
 
617
CREATE_ACCESS_FUNCTIONS(Mod, Offset,                   "Offset",          *value = cv->mbCvMod.modPatch[arg].offset + 0x80,             cv->mbCvMod.modPatch[arg].offset = (int)value - 0x80);
607
CREATE_ACCESS_FUNCTIONS(Mod, Src1,                     "Source1",         *value = cv->mbCvMod.modPatch[arg].src1,                      cv->mbCvMod.modPatch[arg].src1 = value);
618
CREATE_ACCESS_FUNCTIONS(Mod, Src1,                     "Source1",         *value = cv->mbCvMod.modPatch[arg].src1,                      cv->mbCvMod.modPatch[arg].src1 = value);
608
CREATE_ACCESS_FUNCTIONS(Mod, Src1Chn,                  "Source1 CV",      *value = cv->mbCvMod.modPatch[arg].src1_chn,                  cv->mbCvMod.modPatch[arg].src1_chn = value);
619
CREATE_ACCESS_FUNCTIONS(Mod, Src1Chn,                  "Source1 CV",      *value = cv->mbCvMod.modPatch[arg].src1_chn,                  cv->mbCvMod.modPatch[arg].src1_chn = value);
609
CREATE_ACCESS_FUNCTIONS(Mod, Src2,                     "Source2",         *value = cv->mbCvMod.modPatch[arg].src2,                      cv->mbCvMod.modPatch[arg].src2 = value);
620
CREATE_ACCESS_FUNCTIONS(Mod, Src2,                     "Source2",         *value = cv->mbCvMod.modPatch[arg].src2,                      cv->mbCvMod.modPatch[arg].src2 = value);
610
CREATE_ACCESS_FUNCTIONS(Mod, Src2Chn,                  "Source2 CV",      *value = cv->mbCvMod.modPatch[arg].src2_chn,                  cv->mbCvMod.modPatch[arg].src2_chn = value);
621
CREATE_ACCESS_FUNCTIONS(Mod, Src2Chn,                  "Source2 CV",      *value = cv->mbCvMod.modPatch[arg].src2_chn,                  cv->mbCvMod.modPatch[arg].src2_chn = value);
611
CREATE_ACCESS_FUNCTIONS(Mod, Op,                       "Operator",        *value = cv->mbCvMod.modPatch[arg].op & 0x3f,                 cv->mbCvMod.modPatch[arg].op &= 0xc0; cv->mbCvMod.modPatch[arg].op |= (value & 0x3f));
622
CREATE_ACCESS_FUNCTIONS(Mod, Op,                       "Operator",        *value = cv->mbCvMod.modPatch[arg].op & 0x3f,                 cv->mbCvMod.modPatch[arg].op &= 0xc0; cv->mbCvMod.modPatch[arg].op |= (value & 0x3f));
Line 658... Line 669...
658
    // 0x20
669
    // 0x20
659
    NRPN_TABLE_ITEM(  MidiVoice, Legato,             0, 0, 1, 0),
670
    NRPN_TABLE_ITEM(  MidiVoice, Legato,             0, 0, 1, 0),
660
    NRPN_TABLE_ITEM(  MidiVoice, Poly,               0, 0, 1, 0),
671
    NRPN_TABLE_ITEM(  MidiVoice, Poly,               0, 0, 1, 0),
661
    NRPN_TABLE_ITEM(  MidiVoice, SusKey,             0, 0, 1, 0),
672
    NRPN_TABLE_ITEM(  MidiVoice, SusKey,             0, 0, 1, 0),
662
    NRPN_TABLE_ITEM(  MidiVoice, PortamentoMode,     0, 0, 2, 0),
673
    NRPN_TABLE_ITEM(  MidiVoice, PortamentoMode,     0, 0, 2, 0),
663
    NRPN_TABLE_ITEM_EMPTY(),
674
    NRPN_TABLE_ITEM(  MidiVoice, ForceToScale,       0, 0, 1, 0),
664
    NRPN_TABLE_ITEM_EMPTY(),
675
    NRPN_TABLE_ITEM(  MidiVoice, ExtGateThrs,        0, 0, 255, 0),
665
    NRPN_TABLE_ITEM_EMPTY(),
676
    NRPN_TABLE_ITEM_EMPTY(),
666
    NRPN_TABLE_ITEM_EMPTY(),
677
    NRPN_TABLE_ITEM_EMPTY(),
667
    NRPN_TABLE_ITEM_EMPTY8(),
678
    NRPN_TABLE_ITEM_EMPTY8(),
668
679
669
    // 0x030
680
    // 0x030
Line 894... Line 905...
894
    // 0x1f0
905
    // 0x1f0
895
    NRPN_TABLE_ITEM_EMPTY16(),
906
    NRPN_TABLE_ITEM_EMPTY16(),
896
907
897
    // 0x200
908
    // 0x200
898
    NRPN_TABLE_ITEM(  Env1, Amplitude,               0, 0, 255, 1),
909
    NRPN_TABLE_ITEM(  Env1, Amplitude,               0, 0, 255, 1),
-
 
910
    NRPN_TABLE_ITEM(  Env1, CurvePos,                0, 0, MBCV_ENV_NUM_CURVES-1, 0),
899
    NRPN_TABLE_ITEM(  Env1, Curve,                   0, 0, 3, 0), // TODO: create enum for curve
911
    NRPN_TABLE_ITEM(  Env1, CurveNeg,                0, 0, MBCV_ENV_NUM_CURVES-1, 0),
900
    NRPN_TABLE_ITEM(  Env1, Delay,                   0, 0, 255, 0),
912
    NRPN_TABLE_ITEM(  Env1, Delay,                   0, 0, 255, 0),
901
    NRPN_TABLE_ITEM(  Env1, Attack,                  0, 0, 255, 0),
913
    NRPN_TABLE_ITEM(  Env1, Attack,                  0, 0, 255, 0),
902
    NRPN_TABLE_ITEM(  Env1, Decay,                   0, 0, 255, 0),
914
    NRPN_TABLE_ITEM(  Env1, Decay,                   0, 0, 255, 0),
903
    NRPN_TABLE_ITEM(  Env1, Sustain,                 0, 0, 255, 0),
915
    NRPN_TABLE_ITEM(  Env1, Sustain,                 0, 0, 255, 0),
904
    NRPN_TABLE_ITEM(  Env1, Release,                 0, 0, 255, 0),
916
    NRPN_TABLE_ITEM(  Env1, Release,                 0, 0, 255, 0),
905
    NRPN_TABLE_ITEM_EMPTY(),
-
 
906
    NRPN_TABLE_ITEM_EMPTY8(),
917
    NRPN_TABLE_ITEM_EMPTY8(),
907
918
908
    // 0x210
919
    // 0x210
909
    NRPN_TABLE_ITEM(  Env1, ModeClkSync,             0, 0, 1, 0),
920
    NRPN_TABLE_ITEM(  Env1, ModeClkSync,             0, 0, 1, 0),
910
    NRPN_TABLE_ITEM(  Env1, ModeKeySync,             0, 0, 1, 0),
921
    NRPN_TABLE_ITEM(  Env1, ModeKeySync,             0, 0, 1, 0),
Line 938... Line 949...
938
    // 0x270
949
    // 0x270
939
    NRPN_TABLE_ITEM_EMPTY16(),
950
    NRPN_TABLE_ITEM_EMPTY16(),
940
951
941
    // 0x280
952
    // 0x280
942
    NRPN_TABLE_ITEM(  Env2, Amplitude,               0, 0, 255, 1),
953
    NRPN_TABLE_ITEM(  Env2, Amplitude,               0, 0, 255, 1),
-
 
954
    NRPN_TABLE_ITEM(  Env2, CurvePos,                0, 0, MBCV_ENV_NUM_CURVES-1, 0),
943
    NRPN_TABLE_ITEM(  Env2, Curve,                   0, 0, 3, 0), // TODO: create enum for curve
955
    NRPN_TABLE_ITEM(  Env2, CurveNeg,                0, 0, MBCV_ENV_NUM_CURVES-1, 0),
944
    NRPN_TABLE_ITEM(  Env2, Offset,                  0, 0, 255, 0),
956
    NRPN_TABLE_ITEM(  Env2, Offset,                  0, 0, 255, 0),
945
    NRPN_TABLE_ITEM(  Env2, Rate,                    0, 0, 255, 0),
957
    NRPN_TABLE_ITEM(  Env2, Rate,                    0, 0, 255, 0),
946
    NRPN_TABLE_ITEM_EMPTY(),
-
 
947
    NRPN_TABLE_ITEM_EMPTY(),
958
    NRPN_TABLE_ITEM_EMPTY(),
948
    NRPN_TABLE_ITEM_EMPTY(),
959
    NRPN_TABLE_ITEM_EMPTY(),
949
    NRPN_TABLE_ITEM_EMPTY(),
960
    NRPN_TABLE_ITEM_EMPTY(),
950
961
951
    // 0x288
962
    // 0x288
Line 1022... Line 1033...
1022
    // 0x2f0
1033
    // 0x2f0
1023
    NRPN_TABLE_ITEM_EMPTY16(),
1034
    NRPN_TABLE_ITEM_EMPTY16(),
1024
1035
1025
    // 0x300
1036
    // 0x300
1026
    NRPN_TABLE_ITEM(  Mod, Depth,                    0, 0, 255, 1),
1037
    NRPN_TABLE_ITEM(  Mod, Depth,                    0, 0, 255, 1),
-
 
1038
    NRPN_TABLE_ITEM(  Mod, Offset,                   0, 0, 255, 1),
1027
    NRPN_TABLE_ITEM(  Mod, Src1,                     0, 0, MBCV_NUM_MOD_SRC-1, 0),
1039
    NRPN_TABLE_ITEM(  Mod, Src1,                     0, 0, MBCV_NUM_MOD_SRC-1, 0),
1028
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  0, 0, CV_SE_NUM-1, 0),
1040
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  0, 0, CV_SE_NUM-1, 0),
1029
    NRPN_TABLE_ITEM(  Mod, Src2,                     0, 0, MBCV_NUM_MOD_SRC-1, 0),
1041
    NRPN_TABLE_ITEM(  Mod, Src2,                     0, 0, MBCV_NUM_MOD_SRC-1, 0),
1030
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  0, 0, CV_SE_NUM-1, 0),
1042
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  0, 0, CV_SE_NUM-1, 0),
1031
    NRPN_TABLE_ITEM(  Mod, Op,                       0, 0, 14, 0), // TODO: create enum for operations
1043
    NRPN_TABLE_ITEM(  Mod, Op,                       0, 0, 14, 0), // TODO: create enum for operations
1032
    NRPN_TABLE_ITEM(  Mod, Dst1,                     0, 0, MBCV_NUM_MOD_DST-1, 0),
1044
    NRPN_TABLE_ITEM(  Mod, Dst1,                     0, 0, MBCV_NUM_MOD_DST-1, 0),
1033
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  0, 0, 1, 0),
1045
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  0, 0, 1, 0),
1034
    NRPN_TABLE_ITEM(  Mod, Dst2,                     0, 0, MBCV_NUM_MOD_DST-1, 0),
1046
    NRPN_TABLE_ITEM(  Mod, Dst2,                     0, 0, MBCV_NUM_MOD_DST-1, 0),
1035
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  0, 0, 1, 0),
1047
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  0, 0, 1, 0),
1036
    NRPN_TABLE_ITEM_EMPTY(),
-
 
1037
    NRPN_TABLE_ITEM_EMPTY(),
1048
    NRPN_TABLE_ITEM_EMPTY(),
1038
    NRPN_TABLE_ITEM_EMPTY(),
1049
    NRPN_TABLE_ITEM_EMPTY(),
1039
    NRPN_TABLE_ITEM_EMPTY(),
1050
    NRPN_TABLE_ITEM_EMPTY(),
1040
    NRPN_TABLE_ITEM_EMPTY(),
1051
    NRPN_TABLE_ITEM_EMPTY(),
1041
    NRPN_TABLE_ITEM_EMPTY(),
1052
    NRPN_TABLE_ITEM_EMPTY(),
1042
1053
1043
    // 0x310
1054
    // 0x310
1044
    NRPN_TABLE_ITEM(  Mod, Depth,                    1, 0, 255, 1),
1055
    NRPN_TABLE_ITEM(  Mod, Depth,                    1, 0, 255, 1),
-
 
1056
    NRPN_TABLE_ITEM(  Mod, Offset,                   1, 0, 255, 1),
1045
    NRPN_TABLE_ITEM(  Mod, Src1,                     1, 0, MBCV_NUM_MOD_SRC-1, 0),
1057
    NRPN_TABLE_ITEM(  Mod, Src1,                     1, 0, MBCV_NUM_MOD_SRC-1, 0),
1046
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  1, 0, CV_SE_NUM-1, 0),
1058
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  1, 0, CV_SE_NUM-1, 0),
1047
    NRPN_TABLE_ITEM(  Mod, Src2,                     1, 0, MBCV_NUM_MOD_SRC-1, 0),
1059
    NRPN_TABLE_ITEM(  Mod, Src2,                     1, 0, MBCV_NUM_MOD_SRC-1, 0),
1048
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  1, 0, CV_SE_NUM-1, 0),
1060
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  1, 0, CV_SE_NUM-1, 0),
1049
    NRPN_TABLE_ITEM(  Mod, Op,                       1, 0, 14, 0), // TODO: create enum for operations
1061
    NRPN_TABLE_ITEM(  Mod, Op,                       1, 0, 14, 0), // TODO: create enum for operations
1050
    NRPN_TABLE_ITEM(  Mod, Dst1,                     1, 0, MBCV_NUM_MOD_DST-1, 0),
1062
    NRPN_TABLE_ITEM(  Mod, Dst1,                     1, 0, MBCV_NUM_MOD_DST-1, 0),
1051
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  1, 0, 1, 0),
1063
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  1, 0, 1, 0),
1052
    NRPN_TABLE_ITEM(  Mod, Dst2,                     1, 0, MBCV_NUM_MOD_DST-1, 0),
1064
    NRPN_TABLE_ITEM(  Mod, Dst2,                     1, 0, MBCV_NUM_MOD_DST-1, 0),
1053
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  1, 0, 1, 0),
1065
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  1, 0, 1, 0),
1054
    NRPN_TABLE_ITEM_EMPTY(),
-
 
1055
    NRPN_TABLE_ITEM_EMPTY(),
1066
    NRPN_TABLE_ITEM_EMPTY(),
1056
    NRPN_TABLE_ITEM_EMPTY(),
1067
    NRPN_TABLE_ITEM_EMPTY(),
1057
    NRPN_TABLE_ITEM_EMPTY(),
1068
    NRPN_TABLE_ITEM_EMPTY(),
1058
    NRPN_TABLE_ITEM_EMPTY(),
1069
    NRPN_TABLE_ITEM_EMPTY(),
1059
    NRPN_TABLE_ITEM_EMPTY(),
1070
    NRPN_TABLE_ITEM_EMPTY(),
1060
1071
1061
    // 0x320
1072
    // 0x320
1062
    NRPN_TABLE_ITEM(  Mod, Depth,                    2, 0, 255, 1),
1073
    NRPN_TABLE_ITEM(  Mod, Depth,                    2, 0, 255, 1),
-
 
1074
    NRPN_TABLE_ITEM(  Mod, Offset,                   2, 0, 255, 1),
1063
    NRPN_TABLE_ITEM(  Mod, Src1,                     2, 0, MBCV_NUM_MOD_SRC-1, 0),
1075
    NRPN_TABLE_ITEM(  Mod, Src1,                     2, 0, MBCV_NUM_MOD_SRC-1, 0),
1064
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  2, 0, CV_SE_NUM-1, 0),
1076
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  2, 0, CV_SE_NUM-1, 0),
1065
    NRPN_TABLE_ITEM(  Mod, Src2,                     2, 0, MBCV_NUM_MOD_SRC-1, 0),
1077
    NRPN_TABLE_ITEM(  Mod, Src2,                     2, 0, MBCV_NUM_MOD_SRC-1, 0),
1066
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  2, 0, CV_SE_NUM-1, 0),
1078
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  2, 0, CV_SE_NUM-1, 0),
1067
    NRPN_TABLE_ITEM(  Mod, Op,                       2, 0, 14, 0), // TODO: create enum for operations
1079
    NRPN_TABLE_ITEM(  Mod, Op,                       2, 0, 14, 0), // TODO: create enum for operations
1068
    NRPN_TABLE_ITEM(  Mod, Dst1,                     2, 0, MBCV_NUM_MOD_DST-1, 0),
1080
    NRPN_TABLE_ITEM(  Mod, Dst1,                     2, 0, MBCV_NUM_MOD_DST-1, 0),
1069
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  2, 0, 1, 0),
1081
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  2, 0, 1, 0),
1070
    NRPN_TABLE_ITEM(  Mod, Dst2,                     2, 0, MBCV_NUM_MOD_DST-1, 0),
1082
    NRPN_TABLE_ITEM(  Mod, Dst2,                     2, 0, MBCV_NUM_MOD_DST-1, 0),
1071
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  2, 0, 1, 0),
1083
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  2, 0, 1, 0),
1072
    NRPN_TABLE_ITEM_EMPTY(),
-
 
1073
    NRPN_TABLE_ITEM_EMPTY(),
1084
    NRPN_TABLE_ITEM_EMPTY(),
1074
    NRPN_TABLE_ITEM_EMPTY(),
1085
    NRPN_TABLE_ITEM_EMPTY(),
1075
    NRPN_TABLE_ITEM_EMPTY(),
1086
    NRPN_TABLE_ITEM_EMPTY(),
1076
    NRPN_TABLE_ITEM_EMPTY(),
1087
    NRPN_TABLE_ITEM_EMPTY(),
1077
    NRPN_TABLE_ITEM_EMPTY(),
1088
    NRPN_TABLE_ITEM_EMPTY(),
1078
1089
1079
    // 0x330
1090
    // 0x330
1080
    NRPN_TABLE_ITEM(  Mod, Depth,                    3, 0, 255, 1),
1091
    NRPN_TABLE_ITEM(  Mod, Depth,                    3, 0, 255, 1),
-
 
1092
    NRPN_TABLE_ITEM(  Mod, Offset,                   3, 0, 255, 1),
1081
    NRPN_TABLE_ITEM(  Mod, Src1,                     3, 0, MBCV_NUM_MOD_SRC-1, 0),
1093
    NRPN_TABLE_ITEM(  Mod, Src1,                     3, 0, MBCV_NUM_MOD_SRC-1, 0),
1082
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  3, 0, CV_SE_NUM-1, 0),
1094
    NRPN_TABLE_ITEM(  Mod, Src1Chn,                  3, 0, CV_SE_NUM-1, 0),
1083
    NRPN_TABLE_ITEM(  Mod, Src2,                     3, 0, MBCV_NUM_MOD_SRC-1, 0),
1095
    NRPN_TABLE_ITEM(  Mod, Src2,                     3, 0, MBCV_NUM_MOD_SRC-1, 0),
1084
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  3, 0, CV_SE_NUM-1, 0),
1096
    NRPN_TABLE_ITEM(  Mod, Src2Chn,                  3, 0, CV_SE_NUM-1, 0),
1085
    NRPN_TABLE_ITEM(  Mod, Op,                       3, 0, 14, 0), // TODO: create enum for operations
1097
    NRPN_TABLE_ITEM(  Mod, Op,                       3, 0, 14, 0), // TODO: create enum for operations
1086
    NRPN_TABLE_ITEM(  Mod, Dst1,                     3, 0, MBCV_NUM_MOD_DST-1, 0),
1098
    NRPN_TABLE_ITEM(  Mod, Dst1,                     3, 0, MBCV_NUM_MOD_DST-1, 0),
1087
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  3, 0, 1, 0),
1099
    NRPN_TABLE_ITEM(  Mod, Dst1Inv,                  3, 0, 1, 0),
1088
    NRPN_TABLE_ITEM(  Mod, Dst2,                     3, 0, MBCV_NUM_MOD_DST-1, 0),
1100
    NRPN_TABLE_ITEM(  Mod, Dst2,                     3, 0, MBCV_NUM_MOD_DST-1, 0),
1089
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  3, 0, 1, 0),
1101
    NRPN_TABLE_ITEM(  Mod, Dst2Inv,                  3, 0, 1, 0),
1090
    NRPN_TABLE_ITEM_EMPTY(),
-
 
1091
    NRPN_TABLE_ITEM_EMPTY(),
1102
    NRPN_TABLE_ITEM_EMPTY(),
1092
    NRPN_TABLE_ITEM_EMPTY(),
1103
    NRPN_TABLE_ITEM_EMPTY(),
1093
    NRPN_TABLE_ITEM_EMPTY(),
1104
    NRPN_TABLE_ITEM_EMPTY(),
1094
    NRPN_TABLE_ITEM_EMPTY(),
1105
    NRPN_TABLE_ITEM_EMPTY(),
1095
    NRPN_TABLE_ITEM_EMPTY(),
1106
    NRPN_TABLE_ITEM_EMPTY(),