コード例 #1
0
ファイル: analogue.cpp プロジェクト: selectedacre/analogue
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);
            }         
        }
    }
      
}
コード例 #2
0
ファイル: drmr.c プロジェクト: harryhaaren/drmr
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);
    } 
コード例 #3
0
ファイル: so-404.c プロジェクト: EQ4/So-synth-LV2
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);
	}
}