void SynthBase::processKeyboardEvents(MidiBuffer& buffer, int num_samples) { MidiBuffer keyboard_messages; midi_manager_->replaceKeyboardMessages(keyboard_messages, num_samples); processMidi(keyboard_messages); midi_manager_->replaceKeyboardMessages(buffer, num_samples); }
void HelmStandaloneEditor::getNextAudioBlock(const AudioSourceChannelInfo& buffer) { ScopedLock lock(getCriticalSection()); int num_samples = buffer.buffer->getNumSamples(); int synth_samples = std::min(num_samples, MAX_BUFFER_PROCESS); processControlChanges(); processModulationChanges(); MidiBuffer midi_messages; midi_manager_->removeNextBlockOfMessages(midi_messages, num_samples); processMidi(midi_messages); processKeyboardEvents(midi_messages, num_samples); for (int b = 0; b < num_samples; b += synth_samples) { int current_samples = std::min<int>(synth_samples, num_samples - b); processAudio(buffer.buffer, mopo::NUM_CHANNELS, current_samples, b); } }
void HelmPlugin::processBlock(AudioSampleBuffer& buffer, MidiBuffer& midi_messages) { int total_samples = buffer.getNumSamples(); int num_channels = getTotalNumOutputChannels(); AudioPlayHead::CurrentPositionInfo position_info; getPlayHead()->getCurrentPosition(position_info); synth_.setBpm(position_info.bpm); if (position_info.isPlaying || position_info.isLooping || position_info.isRecording) synth_.correctToTime(position_info.timeInSamples); for (int sample_offset = 0; sample_offset < total_samples;) { int num_samples = std::min<int>(total_samples - sample_offset, MAX_BUFFER_PROCESS); processMidi(midi_messages, sample_offset, sample_offset + num_samples); if (synth_.getBufferSize() != num_samples) synth_.setBufferSize(num_samples); synth_.process(); const mopo::mopo_float* synth_output_left = synth_.output(0)->buffer; const mopo::mopo_float* synth_output_right = synth_.output(1)->buffer; for (int channel = 0; channel < num_channels; ++channel) { float* channelData = buffer.getWritePointer(channel, sample_offset); const mopo::mopo_float* synth_output = (channel % 2) ? synth_output_right : synth_output_left; for (int i = 0; i < num_samples; ++i) channelData[i] = synth_output[i]; } int output_inc = synth_.getSampleRate() / mopo::MEMORY_SAMPLE_RATE; for (int i = 0; i < num_samples; i += output_inc) output_memory_->push(synth_output_left[i] + synth_output_right[i]); sample_offset += num_samples; } }
int Sci1SongIterator::nextCommand(byte *buf, int *result) { if (!_initialised) { //printf("[iterator] DEBUG: Initialising for %d\n", _deviceId); _initialised = true; if (initSong()) return SI_FINISHED; } if (_delayRemaining) { int delay = _delayRemaining; _delayRemaining = 0; return delay; } int retval = 0; do { /* All delays must be processed separately */ int chan = getCommandIndex(); if (chan == COMMAND_INDEX_NONE) { return SI_FINISHED; } if (chan == COMMAND_INDEX_PCM) { if (_samples.begin()->announced) { /* Already announced; let's discard it */ Audio::AudioStream *feed = getAudioStream(); delete feed; } else { int delay = _samples.begin()->delta; if (delay) { updateDelta(delay); return delay; } /* otherwise we're touching a PCM */ _samples.begin()->announced = true; return SI_PCM; } } else { /* Not a PCM */ retval = processMidi(buf, result, &(_channels[chan]), PARSE_FLAG_LOOPS_UNLIMITED); if (retval == SI_LOOP) { _numLoopedChannels++; _channels[chan].state = SI_STATE_PENDING; _channels[chan].delay = 0; if (_numLoopedChannels == _numActiveChannels) { int i; /* Everyone's ready: Let's loop */ for (i = 0; i < _numChannels; i++) if (_channels[i].state == SI_STATE_PENDING) _channels[i].state = SI_STATE_DELTA_TIME; _numLoopedChannels = 0; return SI_LOOP; } } else if (retval == SI_FINISHED) { #ifdef DEBUG fprintf(stderr, "FINISHED some channel\n"); #endif } else if (retval > 0) { int sd ; sd = getSmallestDelta(); if (noDeltaTime() && sd) { /* No other channel is ready */ updateDelta(sd); /* Only from here do we return delta times */ return sd; } } } /* Not a PCM */ } while (retval > 0); return retval; }
int Sci0SongIterator::nextCommand(byte *buf, int *result) { return processMidi(buf, result, &_channel, PARSE_FLAG_PARAMETRIC_CUE); }