void Analogue::run(uint32_t sample_count) { LV2_Event_Iterator iter; lv2_event_begin(&iter, p < LV2_Event_Buffer>(m_midi_input)); uint8_t* event_data; uint32_t samples_done = 0; while (samples_done < sample_count) { uint32_t to = sample_count; LV2_Event* ev = 0; if (lv2_event_is_valid(&iter)) { ev = lv2_event_get(&iter, &event_data); to = ev->frames; lv2_event_increment(&iter); } if (to > samples_done) { render(samples_done, to); samples_done = to; } /* This is what we do with events: - if it's a MIDI event, pass it to handle_midi() - if it's something else, just ignore it (it's safe) */ if (ev) { if (ev->type == m_midi_type) { handle_midi(ev->size, event_data); } } } }
static void run(LV2_Handle instance, uint32_t n_samples) { int i,kitInt,baseNote,ignno; DrMr* drmr = (DrMr*)instance; kitInt = (int)floorf(*(drmr->kitReq)); baseNote = (int)floorf(*(drmr->baseNote)); ignno = (int)floorf(*(drmr->ignore_note_off)); if (kitInt != drmr->curKit) // requested a new kit pthread_cond_signal(&drmr->load_cond); LV2_Event_Iterator eit; if (drmr->midi_port && lv2_event_begin(&eit,drmr->midi_port)) { // if we have any events LV2_Event *cur_ev; uint8_t nn; uint8_t* data; while (lv2_event_is_valid(&eit)) { cur_ev = lv2_event_get(&eit,&data); if (cur_ev->type == drmr->uris.midi_event) { //int channel = *data & 15; switch ((*data) >> 4) { case 8: if (!ignno) { nn = data[1]; nn-=baseNote; untrigger_sample(drmr,nn); } break; case 9: { nn = data[1]; nn-=baseNote; trigger_sample(drmr,nn,data); break; } default: printf("Unhandeled status: %i\n",(*data)>>4); } } else printf("unrecognized event\n"); lv2_event_increment(&eit); }
void runSO_404( LV2_Handle arg, uint32_t nframes ) { so_404* so=(so_404*)arg; lv2_event_begin(&so->in_iterator,so->MidiIn); float* outbuffer=so->output; if(*so->controlmode_p >0) { so->cutoff=*so->cutoff_p; so->portamento=*so->portamento_p; so->release=*so->release_p; so->volume=*so->volume_p; so->envmod=*so->envmod_p; so->resonance=*so->resonance_p; } int i; for( i=0; i<nframes; i++ ) { while(lv2_event_is_valid(&so->in_iterator)) { uint8_t* data; LV2_Event* event= lv2_event_get(&so->in_iterator,&data); if (event->type == 0) { so->event_ref->lv2_event_unref(so->event_ref->callback_data, event); } else if(event->type==so->midi_event_id) { if(event->frames > i) { break; } else { const uint8_t* evt=(uint8_t*)data; if((evt[0]&MIDI_CHANNELMASK)==(int) (*so->channel_p)) { if((evt[0]&MIDI_COMMANDMASK)==MIDI_NOTEON) { unsigned int note = evt[1]; so->tfreq=midi_to_hz(note); if( so->noteson == 0 ) { so->freq = so->tfreq; so->amp=1.0; so->vel = ((float)evt[2]); so->env=so->vel/127.0; so->cdelay = 0; } so->noteson += 1; } else if((evt[0]&MIDI_COMMANDMASK)==MIDI_NOTEOFF ) { so->noteson -= 1; if(so->noteson<0) { so->noteson=0; } } else if((*so->controlmode_p<=0) && (evt[0]&MIDI_COMMANDMASK)==MIDI_CONTROL ) { unsigned int command_val=evt[2]; switch(evt[1]) { case 74: so->cutoff =command_val; break; case 65: so->portamento = command_val; break; case 72: so->release = command_val; break; case 7: so->volume = command_val; break; case 79: so->envmod = command_val; break; case 71: so->resonance = command_val; break; } } } } } lv2_event_increment(&so->in_iterator); } if( so->cdelay <= 0 ) { so->freq = ((so->portamento/127.0)*0.9)*so->freq + (1.0-((so->portamento/127.0)*0.9))*so->tfreq; if( so->noteson > 0 ) { so->amp *= 0.99; } else { so->amp *= 0.5; } so->env*=0.8+powf(so->release/127.0,0.25)/5.1; so->fcutoff = powf(so->cutoff/127.0,2.0)+powf(so->env,2.0)*powf(so->envmod/127.0,2.0); so->fcutoff = tanh(so->fcutoff); so->freso = powf(so->resonance/130.0,0.25); so->cdelay = so->samplerate/100; } so->cdelay--; float max = so->samplerate / so->freq; float sample = (so->phase/max)*(so->phase/max)-0.25; so->phase++; if( so->phase >= max ) { so->phase -= max; } if(so->vel>100) { sample*=so->env; } else { sample*=so->amp; } so->fpos += so->fspeed; so->fspeed *= so->freso; so->fspeed += (sample-so->fpos)*so->fcutoff; sample = so->fpos; sample = sample*0.5+so->lastsample*0.5; so->lastsample = sample; outbuffer[i] = sample * (so->volume/127.0); } }