Improve polyphony.
This commit is contained in:
parent
94820594d4
commit
65b539675a
2 changed files with 19 additions and 3 deletions
|
@ -100,7 +100,9 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
|
||||||
program_order.push_back(it->first);
|
program_order.push_back(it->first);
|
||||||
}
|
}
|
||||||
setCurrentProgram(0);
|
setCurrentProgram(0);
|
||||||
|
for (int i = 0; i < Hiopl::CHANNELS+1; i++) {
|
||||||
|
active_notes[i] = NO_NOTE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JuceOplvstiAudioProcessor::~JuceOplvstiAudioProcessor()
|
JuceOplvstiAudioProcessor::~JuceOplvstiAudioProcessor()
|
||||||
|
@ -278,15 +280,27 @@ void JuceOplvstiAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuf
|
||||||
MidiMessage midi_message(0);
|
MidiMessage midi_message(0);
|
||||||
int sample_number;
|
int sample_number;
|
||||||
while (midi_buffer_iterator.getNextEvent(midi_message,sample_number)) {
|
while (midi_buffer_iterator.getNextEvent(midi_message,sample_number)) {
|
||||||
int ch = 1 + (midi_message.getNoteNumber() % Hiopl::CHANNELS); // kind of hackish, but..
|
//int ch = 1 + (midi_message.getNoteNumber() % Hiopl::CHANNELS); // kind of hackish, but..
|
||||||
if (midi_message.isNoteOn()) {
|
if (midi_message.isNoteOn()) {
|
||||||
//note on at sample_number samples after
|
//note on at sample_number samples after
|
||||||
//the beginning of the current buffer
|
//the beginning of the current buffer
|
||||||
float noteHz = (float)MidiMessage::getMidiNoteInHertz(midi_message.getNoteNumber());
|
int n = midi_message.getNoteNumber();
|
||||||
|
float noteHz = (float)MidiMessage::getMidiNoteInHertz(n);
|
||||||
|
int ch = 1;
|
||||||
|
while (ch <= Hiopl::CHANNELS && NO_NOTE != active_notes[ch]) {
|
||||||
|
ch += 1;
|
||||||
|
}
|
||||||
Opl->KeyOn(ch, noteHz);
|
Opl->KeyOn(ch, noteHz);
|
||||||
|
active_notes[ch] = n;
|
||||||
}
|
}
|
||||||
else if (midi_message.isNoteOff()) {
|
else if (midi_message.isNoteOff()) {
|
||||||
|
int n = midi_message.getNoteNumber();
|
||||||
|
int ch = 1;
|
||||||
|
while (ch <= Hiopl::CHANNELS && n != active_notes[ch]) {
|
||||||
|
ch += 1;
|
||||||
|
}
|
||||||
Opl->KeyOff(ch);
|
Opl->KeyOff(ch);
|
||||||
|
active_notes[ch] = NO_NOTE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Opl->Generate(buffer.getNumSamples(), buffer.getSampleData(0));
|
Opl->Generate(buffer.getNumSamples(), buffer.getSampleData(0));
|
||||||
|
|
|
@ -77,6 +77,8 @@ private:
|
||||||
std::map<String, std::vector<float>> programs;
|
std::map<String, std::vector<float>> programs;
|
||||||
std::vector<String> program_order;
|
std::vector<String> program_order;
|
||||||
int i_program;
|
int i_program;
|
||||||
|
static const int NO_NOTE=-1;
|
||||||
|
int active_notes[Hiopl::CHANNELS+1]; // keyed by channel
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceOplvstiAudioProcessor)
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceOplvstiAudioProcessor)
|
||||||
|
|
Loading…
Reference in a new issue