void LyrebirdAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { // Do Midi things buffer.clear(); int time; MidiMessage m; for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);) { sawGenerator->setWavelength(currentSampleRate, m.getMidiNoteInHertz(m.getNoteNumber())); if (m.isNoteOff()) { sawGenerator->setWavelength(currentSampleRate, 0); } } // In case we have more outputs than inputs, this code clears any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). // I've added this to avoid people getting screaming feedback // when they first compile the plugin, but obviously you don't need to // this code if your algorithm already fills all the output channels. for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) buffer.clear (i, 0, buffer.getNumSamples()); float* leftData = buffer.getWritePointer (0); float* rightData = buffer.getWritePointer(1); for (int sample = 0; sample < buffer.getNumSamples(); sample++) { leftData[sample] = sawGenerator->getCurrentAmplitude(); rightData[sample] = sawGenerator->getCurrentAmplitude(); sawGenerator->incrementSaw(); } }
void SynthAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { const int totalNumInputChannels = getTotalNumInputChannels(); const int totalNumOutputChannels = getTotalNumOutputChannels(); // In case we have more outputs than inputs, this code clears any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). // This is here to avoid people getting screaming feedback // when they first compile a plugin, but obviously you don't need to keep // this code if your algorithm always overwrites all the output channels. MidiBuffer Midi; int time; MidiMessage m; for(MidiBuffer::Iterator i(midiMessages); i.getNextEvent(m, time);){ //handle monophonic on/off of notes if(m.isNoteOn()){ noteOn++; } if(m.isNoteOff()){ noteOn--; } if(noteOn > 0){ monoNoteOn = 1.0f; env.reset(); //handle the pitch of the note noteVal = m.getNoteNumber(); osc.setF(m.getMidiNoteInHertz(noteVal)); }else{ monoNoteOn = 0.0f; } } for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); for (int channel = 0; channel < totalNumOutputChannels; ++channel){ //just do the synth stuff on one channel. if(channel == 0){ for(int sample = 0; sample < buffer.getNumSamples(); ++sample){ //do this stuff here. it's terribly inefficient.. freqValScaled = 20000.0f * pow(freqP->get(), 3.0f); envValScaled = 10000.0f * pow(envP->get(), 3.0f); speedValScaled = pow((1.0f - speedP->get()), 2.0f); oscValScaled = (oscP->get() - 0.5f) * 70.0f; detValScaled = (detP->get() - 0.5f) * 24.0f; filter.setFc(freqSmoothing.process(freqValScaled + (envValScaled * pow(env.process(),3.0f))) / UPSAMPLING); env.setSpeed(speedValScaled); filter.setQ(qP->get()); float frequency = noteVal + 24.0f + oscValScaled + modOsc.process(0) + (driftSmoothing.process(random.nextFloat() - 0.5f) * 20.0f); float frequency2 = exp((frequency + detValScaled + (driftSmoothing2.process(random.nextFloat() - 0.5f) * 10.0f)) / 17.31f) / UPSAMPLING; frequency = exp(frequency / 17.31f) / UPSAMPLING; osc.setF(frequency); osc2.setF(frequency2); float monoNoteOn2 = ampSmoothing.process(monoNoteOn); float data; for(int i = 0; i < UPSAMPLING; i++){ data = 20.0f * filter.process(0.1f * osc.process() + ampP->get() * 0.1f * osc2.process()); } data *= monoNoteOn2; buffer.setSample(0, sample, data); buffer.setSample(1, sample, data); } } } }