Пример #1
0
static uint32_t synthSound (B3S *instance, uint32_t written, uint32_t nframes, float **out) {
  B3S* b3s = (B3S*)instance;

  while (written < nframes) {
    int nremain = nframes - written;

    if (b3s->boffset >= BUFFER_SIZE_SAMPLES)  {
      b3s->boffset = 0;
      oscGenerateFragment (instance->inst->synth, b3s->bufA, BUFFER_SIZE_SAMPLES);
      preamp (instance->inst->preamp, b3s->bufA, b3s->bufB, BUFFER_SIZE_SAMPLES);
      reverb (instance->inst->reverb, b3s->bufB, b3s->bufC, BUFFER_SIZE_SAMPLES);
#ifdef WITH_SIGNATURE
      scramble (b3s, b3s->bufC, BUFFER_SIZE_SAMPLES);
#endif
      whirlProc3(instance->inst->whirl, b3s->bufC, b3s->bufL[0], b3s->bufL[1], b3s->bufD[0], b3s->bufD[1], BUFFER_SIZE_SAMPLES);

    }

    int nread = MIN(nremain, (BUFFER_SIZE_SAMPLES - b3s->boffset));

    memcpy(&out[0][written], &b3s->bufL[0][b3s->boffset], nread*sizeof(float));
    memcpy(&out[1][written], &b3s->bufL[1][b3s->boffset], nread*sizeof(float));

    written+=nread;
    b3s->boffset+=nread;
  }
  return written;
}
int REVERBIT::run()
{
    int samps = framesToRun() * inputChannels();

    if (currentFrame() < insamps)
        rtgetin(in, this, samps);

    for (int i = 0; i < samps; i += inputChannels()) {
        if (--branch <= 0) {
            doupdate();
            branch = getSkip();
        }

        float insig[2], out[2];

        if (currentFrame() < insamps) {        // still taking input from file
            insig[0] = in[i] * amp;
            insig[1] = (inputChannels() == 2) ? in[i + 1] * amp : insig[0];
        }
        else                                   // in ring-down phase
            insig[0] = insig[1] = 0.0;

        float rvbsig = -reverbpct * reverb(insig[0] + insig[1], rvbarray);

        if (usefilt)
            rvbsig = tone(rvbsig, tonedata);

        delput(rvbsig, delarray, deltabs);
        float delsig = delget(delarray, rtchan_delaytime, deltabs);

        out[0] = insig[0] + rvbsig;
        out[1] = insig[1] + delsig;

        if (dcblock) {
            float tmp_in[2];

            tmp_in[0] = out[0];
            tmp_in[1] = out[1];

            out[0] = tmp_in[0] - prev_in[0] + (0.99 * prev_out[0]);
            prev_in[0] = tmp_in[0];
            prev_out[0] = out[0];

            out[1] = tmp_in[1] - prev_in[1] + (0.99 * prev_out[1]);
            prev_in[1] = tmp_in[1];
            prev_out[1] = out[1];
        }

        rtaddout(out);
        increment();
    }

    return framesToRun();
}
Пример #3
0
static void
run(LV2_Handle instance, uint32_t n_samples)
{
  B3R* b3r = (B3R*)instance;

  const float* const input  = b3r->input;
  float* const       output = b3r->output;

  if(b3r->mix)
    setReverbMix (b3r->instance, *(b3r->mix));
  if(b3r->gain_in)
    setReverbInputGain (b3r->instance, *(b3r->gain_in));
  if(b3r->gain_out)
    setReverbOutputGain (b3r->instance, *(b3r->gain_out));
  reverb(b3r->instance, input, output, n_samples);
}
Пример #4
0
QVariant Part::getProperty(P_ID id) const
      {
      switch (id) {
            case P_ID::VISIBLE:
                  return QVariant(_show);
            case P_ID::USE_DRUMSET:
                  return instrument()->useDrumset();
            case P_ID::PART_VOLUME:
                  return volume();
            case P_ID::PART_MUTE:
                  return mute();
            case P_ID::PART_PAN:
                  return pan();
            case P_ID::PART_REVERB:
                  return reverb();
            case P_ID::PART_CHORUS:
                  return chorus();
            default:
                  return QVariant();
            }
      }
Пример #5
0
/* ------------------------------------------------------------------ run --- */
int MROOM::run()
{
   const int samps = framesToRun() * inputChannels();

   rtgetin(in, this, samps);

   for (int i = 0; i < samps; i += inputChannels()) {
      float insig, delval = 0.0, rvbsig = 0.0;

      if (currentFrame() < insamps) {        /* still taking input */
         if (--branch <= 0) {
            if (amparray)
               aamp = tablei(currentFrame(), amparray, amptabs) * ovamp;
            branch = skip;
         }
         if (--quantbranch <= 0) {
            float xposit = tablei(currentFrame(), xpos, xpostabs);
            float yposit = tablei(currentFrame(), ypos, ypostabs);
            distndelset(xposit, yposit, xdim, ydim, innerwidth, reflect);
            quantbranch = quantskip;
         }

         if (inchan == AVERAGE_CHANS) {
            insig = 0.0;
            for (int n = 0; n < inputChannels(); n++)
               insig += in[i + n];
            insig /= (float)inputChannels();
         }
         else
            insig = in[i + inchan];
         insig *= aamp;
      }
      else                                   /* in ring-down phase */
         insig = 0.0;

      DELPUT(insig, delayline, deltabs);

      float rout = 0.0;
      for (int m = 1; m < NTAPS; m += 2) {
#ifdef INTERP_GET
         DLIGET(delayline, del[m], deltabs, delval);
#else
         DELGET(delayline, del[m], deltabs, delval);
#endif
         rout += delval * amp[m];
         if (m < 2)
            rvbsig = -rout;
      }
      rvbsig += rout;

      float out[2];
      out[0] = rout + reverb(rvbsig, rvbarrayr);

      float lout = 0.0;
      for (int m = 0; m < NTAPS; m += 2) {
#ifdef INTERP_GET
         DLIGET(delayline, del[m], deltabs, delval);
#else
         DELGET(delayline, del[m], deltabs, delval);
#endif
         lout += delval * amp[m];
         if (m < 2)
            rvbsig = -lout;
      }
      rvbsig += lout;
      out[1] = lout + reverb(rvbsig, rvbarrayl);

      rtaddout(out);
      increment();
   }

   return framesToRun();
}
Пример #6
0
int jack_audio_callback (jack_nframes_t nframes, void *arg) {
  jack_default_audio_sample_t **out = j_output_bufferptrs;
  int i;

  void *jack_midi_buf = NULL;
  int midi_events = 0;
  jack_nframes_t midi_tme_proc = 0;

  if (!synth_ready) {
    for (i=0;i<AUDIO_CHANNELS;i++) {
      out[i] = (jack_default_audio_sample_t*) jack_port_get_buffer (j_output_port[i], nframes);
      memset(out[i], 0, nframes*sizeof(jack_default_audio_sample_t));
    }
    return (0);
  }

  if (use_jack_midi) {
    jack_midi_buf = jack_port_get_buffer(jack_midi_port, nframes);
    midi_events = jack_midi_get_event_count(jack_midi_buf);
  }

  for (i=0;i<AUDIO_CHANNELS;i++) {
    out[i] = (jack_default_audio_sample_t*) jack_port_get_buffer (j_output_port[i], nframes);
  }

  static int boffset = BUFFER_SIZE_SAMPLES;

  jack_nframes_t written = 0;

  while (written < nframes) {
    int nremain = nframes - written;

    if (boffset >= BUFFER_SIZE_SAMPLES)  {
      if (use_jack_midi) {
	for (i=0; i<midi_events; i++) {
	  jack_midi_event_t ev;
	  jack_midi_event_get(&ev, jack_midi_buf, i);
	  if (ev.time >= written && ev.time < (written + BUFFER_SIZE_SAMPLES))
	    parse_raw_midi_data(arg, ev.buffer, ev.size);
	}
	midi_tme_proc = written + BUFFER_SIZE_SAMPLES;
      }
      boffset = 0;
      oscGenerateFragment (inst.synth, bufA, BUFFER_SIZE_SAMPLES);
      preamp (inst.preamp, bufA, bufB, BUFFER_SIZE_SAMPLES);
      reverb (inst.reverb, bufB, bufC, BUFFER_SIZE_SAMPLES);

#ifdef HAVE_ZITACONVOLVE
      whirlProc2(inst.whirl,
	  bufC,
	  NULL, NULL,
	  bufH[0], bufH[1],
	  bufD[0], bufD[1],
	  BUFFER_SIZE_SAMPLES);

      const float *horn[2] = { bufH[0], bufH[1] };
      const float *drum[2] = { bufD[0], bufD[1] };
      float *out[2] = { bufJ[0], bufJ[1] };

      convolve(horn, out, 2, BUFFER_SIZE_SAMPLES);
      mixdown(out, drum, AUDIO_CHANNELS, BUFFER_SIZE_SAMPLES);
#else
      whirlProc(inst.whirl, bufC, bufJ[0], bufJ[1], BUFFER_SIZE_SAMPLES);
#endif
    }

    int nread = MIN(nremain, (BUFFER_SIZE_SAMPLES - boffset));

    for (i=0;i< AUDIO_CHANNELS; i++) {
      memcpy(&out[i][written], &bufJ[i][boffset], nread*sizeof(float));
    }
    written+=nread;
    boffset+=nread;
  }

  if (use_jack_midi) {
    /* process remaining MIDI events
     * IF nframes < BUFFER_SIZE_SAMPLES OR nframes != N * BUFFER_SIZE_SAMPLES
     */
    for (i=0; i<midi_events; i++) {
      jack_midi_event_t ev;
      jack_midi_event_get(&ev, jack_midi_buf, i);
      if (ev.time >= midi_tme_proc)
	parse_raw_midi_data(arg, ev.buffer, ev.size);
    }
  }

  return(0);
}