177
183
int controller[NUM_CONTROLLER];
179
void write(int, float**, int);
180
void noteon(int channel, int pitch, int velo);
181
185
void noteoff(int channel, int pitch);
182
void setController(int channel, int ctrl, int val);
183
void sysex(const unsigned char* data, int len);
184
void parameterRequest(int pn);
187
virtual void process(float**, int, int);
188
virtual void note(int channel, int pitch, int velo);
189
virtual bool setController(int channel, int ctrl, int val);
190
virtual bool sysex(int, const unsigned char*);
191
void getInitData(int* n, const unsigned char**p);
193
void setController(int ctrl, int data);
186
195
float *wave_tbl(int wave);
187
196
double lowpass_filter(double cutoff, double resonance, double input, LPFilter *f);
198
virtual bool guiVisible() const;
199
virtual void showGui(bool);
200
virtual bool hasGui() const { return true; }
201
virtual void getGeometry(int* x, int* y, int* w, int* h) const;
202
virtual void setGeometry(int x, int y, int w, int h);
190
VAM(const char* classname);
193
virtual int getMidiInitEvent(int id, RawMidiEvent *);
209
bool init(const char* name);
196
212
float* VAM::sin_tbl;
197
213
float* VAM::tri_tbl;
205
221
//---------------------------------------------------------
207
223
//---------------------------------------------------------
209
VAM::VAM(const char* cn)
215
for(i = 0; i < CB_AMP_SIZE; i++) {
216
cb2amp_tab[i] = pow(10.0, double(i) / -300.0);
217
// cb2amp_tab[i] = 1.0 - i/(float)CB_AMP_SIZE;
219
for(i = 0; i < LIN2EXP_SIZE; i++) {
221
lin2exp[i] = 1.5 * tmp * tmp * tmp - 0.69 * tmp * tmp + 0.16 * tmp;
223
int sr = sampleRate();
224
/* Build up denormalised oscilator wavetables, these are sample_rate
225
long, costs more RAM to create them but makes freqency calcs much
226
cheaper, and means that interpolation isn't that neccesary, esp if
227
you use integer frequncies */
229
float *tmp_tbl = new float[sr];
230
const int lag = sr/50;
231
sin_tbl = new float[sr];
232
for (i = 0; i < sr; i++) {
233
tmp = sin(i * 2.0 * PI / sr);
234
sin_tbl[i] = DENORMALISE(tmp);
236
tri_tbl = new float[sr];
237
for (i = 0; i < sr; i++) {
238
tmp = acos(cos(i * 2.0 * PI / sr)) / PI * 2.0 - 1.0;
239
tri_tbl[i] = DENORMALISE(tmp);
241
squ_tbl = new float[sr];
242
for (i = 0; i < sr/2; i++) {
245
for (i = sr/2; i < sr; i++) {
249
for (i = (sr/2)-lag; i < (sr/2)+lag; i++) {
251
tmp += 1.0/(lag * 2.0);
253
for (i = 0; i < sr; i++) {
254
squ_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] +
255
tmp_tbl[MOD(i+lag, sr)]) * 0.5;
257
saw_tbl = new float[sr];
258
for (i = 0; i < sr; i++) {
259
tmp = ((2.0 * i) - (float)sr) / (float)sr;
260
tmp_tbl[i] = DENORMALISE(tmp);
262
for (i = 0; i < sr; i++) {
263
saw_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] +
264
tmp_tbl[MOD(i+lag, sr)]) * 0.5;
269
dco1_filter.out[0] = dco1_filter.out[1] = dco1_filter.out[2] = dco1_filter.out[3] = 0.0;
270
dco1_filter.in[0] = dco1_filter.in[1] = dco1_filter.in[2] = dco1_filter.in[3] = 0.0;
271
dco2_filter.out[0] = dco2_filter.out[1] = dco2_filter.out[2] = dco2_filter.out[3] = 0.0;
272
dco2_filter.in[0] = dco2_filter.in[1] = dco2_filter.in[2] = dco2_filter.in[3] = 0.0;
284
232
//---------------------------------------------------------
286
234
//---------------------------------------------------------
292
240
delete[] sin_tbl;
293
241
delete[] tri_tbl;
294
242
delete[] saw_tbl;
295
243
delete[] squ_tbl;
299
247
//---------------------------------------------------------
356
304
//---------------------------------------------------------
306
bool VAM::init(const char* name)
309
gui->setCaption(QString(name));
315
for(i = 0; i < CB_AMP_SIZE; i++) {
316
cb2amp_tab[i] = pow(10.0, double(i) / -300.0);
317
// cb2amp_tab[i] = 1.0 - i/(float)CB_AMP_SIZE;
319
for(i = 0; i < LIN2EXP_SIZE; i++) {
321
lin2exp[i] = 1.5 * tmp * tmp * tmp - 0.69 * tmp * tmp + 0.16 * tmp;
323
int sr = sampleRate();
324
/* Build up denormalised oscilator wavetables, these are sample_rate
325
long, costs more RAM to create them but makes freqency calcs much
326
cheaper, and means that interpolation isn't that neccesary, esp if
327
you use integer frequncies */
329
float *tmp_tbl = new float[sr];
330
const int lag = sr/50;
331
sin_tbl = new float[sr];
332
for (i = 0; i < sr; i++) {
333
tmp = sin(i * 2.0 * PI / sr);
334
sin_tbl[i] = DENORMALISE(tmp);
336
tri_tbl = new float[sr];
337
for (i = 0; i < sr; i++) {
338
tmp = acos(cos(i * 2.0 * PI / sr)) / PI * 2.0 - 1.0;
339
tri_tbl[i] = DENORMALISE(tmp);
341
squ_tbl = new float[sr];
342
for (i = 0; i < sr/2; i++) {
345
for (i = sr/2; i < sr; i++) {
349
for (i = (sr/2)-lag; i < (sr/2)+lag; i++) {
351
tmp += 1.0/(lag * 2.0);
353
for (i = 0; i < sr; i++) {
354
squ_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] +
355
tmp_tbl[MOD(i+lag, sr)]) * 0.5;
357
saw_tbl = new float[sr];
358
for (i = 0; i < sr; i++) {
359
tmp = ((2.0 * i) - (float)sr) / (float)sr;
360
tmp_tbl[i] = DENORMALISE(tmp);
362
for (i = 0; i < sr; i++) {
363
saw_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] +
364
tmp_tbl[MOD(i+lag, sr)]) * 0.5;
369
dco1_filter.out[0] = dco1_filter.out[1] = dco1_filter.out[2] = dco1_filter.out[3] = 0.0;
370
dco1_filter.in[0] = dco1_filter.in[1] = dco1_filter.in[2] = dco1_filter.in[3] = 0.0;
371
dco2_filter.out[0] = dco2_filter.out[1] = dco2_filter.out[2] = dco2_filter.out[3] = 0.0;
372
dco2_filter.in[0] = dco2_filter.in[1] = dco2_filter.in[2] = dco2_filter.in[3] = 0.0;
360
379
memset(controller, 0, sizeof(controller));
362
381
int maxval = 128*128-1;
394
413
setController(0, DCO1_PW, 0);
395
414
setController(0, DCO2_PW, 0);
402
420
//---------------------------------------------------------
404
422
//---------------------------------------------------------
406
void VAM::write(int sampleCount, float** ports, int offset)
424
void VAM::process(float** ports, int offset, int sampleCount)
427
// get and process all pending events from the
430
while (gui->fifoSize()) {
431
MidiPlayEvent ev = gui->readEvent();
432
if (ev.type() == ME_CONTROLLER) {
434
setController(ev.dataA() & 0xfff, ev.dataB());
438
printf("Organ::process(): unknown event\n");
408
440
float* buffer = *ports + offset;
527
559
//---------------------------------------------------------
529
void VAM::setController(int /*channel*/, int ctrl, int data)
561
bool VAM::setController(int /*channel*/, int ctrl, int data)
563
setController(ctrl & 0xfff, data);
564
MidiPlayEvent ev(0, 0, channel, ME_CONTROLLER, ctrl, data);
569
void VAM::setController(int ctrl, int data)
531
571
// fprintf(stderr, "ctrl: %d data: %d\n", ctrl, data);
532
572
int maxval = 128*128-1;
533
573
double normval = double(data) / double(maxval);
535
575
case DCO1_PITCHMOD:
536
576
dco1.pitchmod = (data - 8191) / 341.333;
659
700
data[4] = controller[ctrl] & 0x7f;
660
701
data[5] = (controller[ctrl] >> 7) & 0x7f;
661
sendSysex(data, sizeof(data));
702
sendSysex(data, sizeof(data));
706
//---------------------------------------------------------
708
//---------------------------------------------------------
710
void VAM::getInitData(int* n, const unsigned char**p)
713
for (int i = 0; i < NUM_CONTROLLER; ++i) {
714
int val = controller[i];
717
*n = NUM_CONTROLLER * sizeof(int); // sizeof(idata);
718
*p = (unsigned char*)idata;
664
721
//---------------------------------------------------------
666
723
//---------------------------------------------------------
668
void VAM::sysex(const unsigned char* data, int len)
670
if (len >= 6 && data[0] == 0xf0 && data[len-1] == 0xf7) {
671
//---------------------------------------------
673
//---------------------------------------------
675
if (data[1] == 0x7c) {
678
printf("vam: bad sysEx:\n");
681
if (data[2] == 2) { // vam voice
682
if (data[3] == 1) { // get parameter
683
parameterRequest(data[4]);
689
printf("vam: unknown sysex received, len %d:\n", len);
690
for (int i = 0; i < len; ++i)
691
printf("%02x ", data[i]);
696
int VAM::getMidiInitEvent(int id, RawMidiEvent *ev)
698
if(id >= NUM_CONTROLLER)
700
ev->setType(SND_SEQ_EVENT_NONREGPARAM);
703
ev->setDataB(controller[id]);
725
bool VAM::sysex(int n, const unsigned char* data)
727
if (n != (NUM_CONTROLLER * sizeof(int))) {
728
printf("Organ: unknown sysex\n");
731
int* s = (int*) data;
732
for (int i = 0; i < NUM_CONTROLLER; ++i) {
734
setController(0, i, val);
739
//---------------------------------------------------------
741
//---------------------------------------------------------
743
bool VAM::guiVisible() const
745
return gui->isVisible();
748
//---------------------------------------------------------
750
//---------------------------------------------------------
752
void VAM::showGui(bool val)
757
//---------------------------------------------------------
759
//---------------------------------------------------------
761
void VAM::getGeometry(int* x, int* y, int* w, int* h) const
763
QPoint pos(gui->pos());
764
QSize size(gui->size());
771
//---------------------------------------------------------
773
//---------------------------------------------------------
775
void VAM::setGeometry(int x, int y, int w, int h)
777
gui->resize(QSize(w, h));
778
gui->move(QPoint(x, y));
707
781
//---------------------------------------------------------
709
783
//---------------------------------------------------------
711
static Mess* inst(const char* name)
713
return new VAM(name);
716
//---------------------------------------------------------
718
//---------------------------------------------------------
725
"Werner Schweer, Josef Lindman H�rnlund",
787
static Mess* instantiate(int sr, QWidget*, const char* name)
789
VAM* vam = new VAM(sr);
790
if (vam->init(name)) {
798
static MESS descriptor = {
801
"0.1", // version string
802
MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
806
const MESS* mess_descriptor() { return &descriptor; }