int process(unsigned nframes, void *v) { (void) v; float seq_sqr[nframes]; float seq_noise[nframes]; float sqr[nframes]; float noise[nframes]; float lfo_f_out[nframes]; float filter_in[nframes]; float *output = (float*) jack_port_get_buffer(port, nframes); void *josc_buf = jack_port_get_buffer(josc, nframes); jack_midi_event_t in_event; jack_nframes_t event_count = jack_midi_get_event_count(josc_buf); // tag::buf-read[] if(event_count) { for(unsigned i=0; i<event_count; i++) { jack_midi_event_get(&in_event, josc_buf, i); assert(*in_event.buffer == '/'); RtDataImpl d; ports.dispatch((char*)in_event.buffer+1, d); } } while(uToB.hasNext()) { RtDataImpl d; d.matches = 0; ports.dispatch(uToB.read()+1, d); if(d.matches == 0) fprintf(stderr, "Unknown Port '%s'\n", uToB.peak()); } // end::buf-read gen_seq(seq_sqr, seq_noise, &seq, nframes); gen_noise(noise, seq_noise, nframes); gen_square(sqr, seq_sqr, &osc, nframes); gen_lfo(lfo_f_out, &lfo, nframes); do_sum(filter_in, noise, sqr, nframes); do_filter(output, filter_in, lfo_f_out, &filter, nframes); return 0; }
#include <cstdlib> #include <rtosc/rtosc.h> #include <rtosc/ports.h> #include <rtosc/port-sugar.h> using namespace rtosc; // g++ 4.8 needs this variable saved separately, otherwise it segfaults constexpr int sizeof_pvowels = sizeof(FilterParams::Pvowels); #define rObject FilterParams::Pvowels_t::formants_t static const rtosc::Ports subsubports = { rParamZyn(freq, "Formant frequency"), rParamZyn(amp, "Strength of formant"), rParamZyn(q, "Quality Factor"), }; #undef rObject static const rtosc::Ports subports = { {"Pformants#" STRINGIFY(FF_MAX_FORMANTS) "/", NULL, &subsubports, [](const char *msg, RtData &d) { const char *mm = msg; while(*mm && !isdigit(*mm)) ++mm; unsigned idx = atoi(mm); SNIP; FilterParams::Pvowels_t *obj = (FilterParams::Pvowels_t *) d.obj; d.obj = (void*) &obj->formants[idx]; subsubports.dispatch(msg, d);