void Proc::trace(const Trace &trace) { if (!interactive_) { return; } Word num = trace.size(); writeTrace(wrapTraceData(t_)); writeTrace(wrapTraceData(num)); for (Trace::const_iterator i = trace.begin(); i != trace.end(); ++i) { Word portNum = i->first; writeTrace(wrapTraceData(portNum)); writeTrace(wrapTraceData(i->second)); } }
void Proc::openTrace() { if (!interactive_) { return; } std::ostringstream scenarioIdStream; scenarioIdStream << scenarioId_; std::string traceFn = "trace" + scenarioIdStream.str() + ".osf"; trace_ = std::fopen(traceFn.c_str(), "w"); assert(trace_ != NULL); writeTrace(wrapTraceData(magicId)); writeTrace(wrapTraceData(teamId)); writeTrace(wrapTraceData(scenarioId_)); Trace trc = Trace(); trc.push_back(PortAction(scenarioInPort, scenarioId_)); trace(trc); }
//============================================================================== RemoteGoatVstAudioProcessor::RemoteGoatVstAudioProcessor() { writeTrace("Goat Trace!"); _repaintTimer = new RepaintTimer(this); for (const String& sampleName : SAMPLE_NAMES) { _samples[sampleName] = Sample(this, sampleName); } _filesystemTimer = new FilesystemTimer(this); for (int i = 0; i < SAMPLE_NAMES_COUNT; ++i) _noteNumberSampleNameMap[i] = SAMPLE_NAMES[i]; }
int main(int argc, char** argv) { char *inputFile; char *traceFileName = NULL; int len; if (parseOptions(argc, argv) || argc - optind != 2) { fprintf(stderr, "Usage: %s [-v version] input_file trace_prefix\n", argv[0]); exit(1); } inputFile = argv[optind++]; parseInputFile(inputFile); traceFileName = argv[optind++]; writeTrace(traceFileName); return 0; }
AudioProcessorEditor* RemoteGoatVstAudioProcessor::createEditor() { writeTrace("Create editor"); return new RemoteGoatVstAudioProcessorEditor(this); }
void RemoteGoatVstAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { //if (!midiMessages.isEmpty()) //{ // String trace; // trace << "MIDI:"; // for (int i = 0; i < midiMessages.data.size(); ++i) // { // trace << String::formatted(" %02X", midiMessages.data[i]); // } // writeTrace(trace); //} // For each sample name, // a sorted collection of "note on" event sample positions. std::map<String, std::set<std::pair<int, bool>>> noteOnSets; MidiBuffer::Iterator it(midiMessages); MidiMessage midiMessage; int samplePosition; while (it.getNextEvent(midiMessage, samplePosition)) { // Check note number, map to sample name. int note = midiMessage.getNoteNumber(); auto itt = _noteNumberSampleNameMap.find(note); if (itt != _noteNumberSampleNameMap.end()) { String sampleName = itt->second; if (midiMessage.isNoteOn()) // Save note on sample position for sample. noteOnSets[sampleName].insert(std::make_pair(samplePosition, true)); else if (midiMessage.isNoteOff()) noteOnSets[sampleName].insert(std::make_pair(samplePosition, false)); } } midiMessages.clear(); buffer.clear(0, 0, buffer.getNumSamples()); buffer.clear(1, 0, buffer.getNumSamples()); for (auto& samplePair : _samples) { Sample& sample = samplePair.second; auto noteOnSetsIterator = noteOnSets.find(sample.getName()); if (noteOnSetsIterator != noteOnSets.end()) { const std::set<std::pair<int, bool>>& noteOns = noteOnSetsIterator->second; int offset = noteOns.begin()->first; sample.read(buffer, 0, offset, false); for (auto noteOnIterator = noteOns.begin(); noteOnIterator != noteOns.end(); ++noteOnIterator) { int noteOn = noteOnIterator->first; bool onOrOff = noteOnIterator->second; writeTrace(String() << "Triggered " << sample.getName() + " (" << (int)onOrOff << ")"); auto nextNoteOnIterator = noteOnIterator; ++nextNoteOnIterator; if (nextNoteOnIterator != noteOns.end()) { int nextNoteOn = nextNoteOnIterator->first; int diff = nextNoteOn - noteOn; if (onOrOff) sample.read(buffer, offset, diff, true); else sample.noteOff(); offset += diff; } else { if (onOrOff) sample.read(buffer, offset, buffer.getNumSamples() - offset, true); else sample.noteOff(); } } } else { sample.read(buffer, 0, buffer.getNumSamples(), false); } } }