2
0
Fork 0

Add parameters for tremolo and vibrato depth, enable/disable velocity tracking. Correct keyscaling parameter names.

This commit is contained in:
bruce 2013-09-22 19:10:28 +08:00
parent bdedbbd722
commit cc5ee743ca
4 changed files with 74 additions and 14 deletions

View file

@ -7,6 +7,7 @@
JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
{
// Initalize OPL
velocity = false;
Opl = new Hiopl(44100); // 1 second at 44100
Opl->SetSampleRate(44100);
Opl->EnableWaveformControl();
@ -31,6 +32,10 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
StringArray(frq_multipliers, sizeof(frq_multipliers)/sizeof(String)))
);
const String onoff[] = {"Disable", "Enable"};
params.push_back(new EnumFloatParameter("Velocity Scaling",
StringArray(onoff, sizeof(onoff)/sizeof(String)))
);
const String levels[] = {"0.00 dB", "0.75 dB", "1.50 dB", "2.25 dB", "3.00 dB", "3.75 dB", "4.50 dB", "5.25 dB", "6.00 dB", "6.75 dB", "7.50 dB", "8.25 dB", "9.00 dB", "9.75 dB", "10.50 dB", "11.25 dB", "12.00 dB", "12.75 dB", "13.50 dB", "14.25 dB", "15.00 dB", "15.75 dB", "16.50 dB", "17.25 dB", "18.00 dB", "18.75 dB", "19.50 dB", "20.25 dB", "21.00 dB", "21.75 dB", "22.50 dB", "23.25 dB", "24.00 dB", "24.75 dB", "25.50 dB", "26.25 dB", "27.00 dB", "27.75 dB", "28.50 dB", "29.25 dB", "30.00 dB", "30.75 dB", "31.50 dB", "32.25 dB", "33.00 dB", "33.75 dB", "34.50 dB", "35.25 dB", "36.00 dB", "36.75 dB", "37.50 dB", "38.25 dB", "39.00 dB", "39.75 dB", "40.50 dB", "41.25 dB", "42.00 dB", "42.75 dB", "43.50 dB", "44.25 dB", "45.00 dB", "45.75 dB", "46.50 dB", "47.25 dB"};
params.push_back(new EnumFloatParameter("Carrier Attenuation",
StringArray(levels, sizeof(levels)/sizeof(String)))
@ -39,7 +44,15 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
StringArray(levels, sizeof(levels)/sizeof(String)))
);
const String onoff[] = {"Disable", "Enable"};
const String depth[] = {"Light", "Heavy"};
params.push_back(new EnumFloatParameter("Tremolo Depth",
StringArray(depth, sizeof(depth)/sizeof(String)))
);
params.push_back(new EnumFloatParameter("Vibrato Depth",
StringArray(depth, sizeof(depth)/sizeof(String)))
);
params.push_back(new EnumFloatParameter("Carrier Tremolo",
StringArray(onoff, sizeof(onoff)/sizeof(String)))
);
@ -49,7 +62,7 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
params.push_back(new EnumFloatParameter("Carrier Sustain",
StringArray(onoff, sizeof(onoff)/sizeof(String)))
);
params.push_back(new EnumFloatParameter("Carrier Keyscaling",
params.push_back(new EnumFloatParameter("Carrier Keyscale Rate",
StringArray(onoff, sizeof(onoff)/sizeof(String)))
);
params.push_back(new EnumFloatParameter("Modulator Tremolo",
@ -61,15 +74,15 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
params.push_back(new EnumFloatParameter("Modulator Sustain",
StringArray(onoff, sizeof(onoff)/sizeof(String)))
);
params.push_back(new EnumFloatParameter("Modulator Keyscaling",
params.push_back(new EnumFloatParameter("Modulator Keyscale Rate",
StringArray(onoff, sizeof(onoff)/sizeof(String)))
);
const String ksrs[] = {"None","1.5 dB/8ve","3 dB/8ve","6 dB/8ve"};
params.push_back(new EnumFloatParameter("Carrier KSR",
params.push_back(new EnumFloatParameter("Carrier Keyscale Level",
StringArray(ksrs, sizeof(ksrs)/sizeof(String)))
);
params.push_back(new EnumFloatParameter("Modulator KSR",
params.push_back(new EnumFloatParameter("Modulator Keyscale Level",
StringArray(ksrs, sizeof(ksrs)/sizeof(String)))
);
@ -109,7 +122,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_0[] = {
0.000000f, 0.660000f, // waveforms
0.066667f, 0.133333f, // frq multipliers
0.000000f, // velocity scaling
0.142857f, 0.412698f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 1.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 1.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -124,7 +139,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_19189[] = {
0.000000f, 0.000000f, // waveforms
0.066667f, 0.200000f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.285714f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 0.0f, 1.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -139,7 +156,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_38377[] = {
0.000000f, 0.330000f, // waveforms
0.066667f, 0.066667f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.460317f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -154,7 +173,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_38392[] = {
0.000000f, 0.000000f, // waveforms
0.000000f, 0.000000f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.000000f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 1.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -169,7 +190,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_39687[] = {
0.000000f, 0.000000f, // waveforms
0.066667f, 0.333333f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.301587f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 1.000000f, // KSR/8ve
@ -184,7 +207,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_76784[] = {
0.000000f, 0.660000f, // waveforms
0.066667f, 0.133333f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.428571f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 1.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -199,7 +224,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_97283[] = {
0.000000f, 0.660000f, // waveforms
0.133333f, 0.400000f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.365079f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 0.0f, 1.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.660000f, // KSR/8ve
@ -215,7 +242,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_3136[] = {
0.000000f, 0.660000f, // waveforms
0.133333f, 0.133333f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.333333f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.000000f, 0.330000f, // KSR/8ve
@ -230,7 +259,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_7254[] = {
0.000000f, 0.330000f, // waveforms
0.066667f, 0.066667f, // frq multipliers
0.000000f, // velocity scaling
0.253968f, 0.476190f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
1.0f, 1.0f, 1.0f, 1.0f, // tre / vib / sus / ks
1.0f, 1.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.000000f, 0.330000f, // KSR/8ve
@ -245,7 +276,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_20108[] = {
0.000000f, 0.000000f, // waveforms
0.400000f, 0.066667f, // frq multipliers
0.000000f, // velocity scaling
0.238095f, 0.000000f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
1.0f, 1.0f, 1.0f, 0.0f, // tre / vib / sus / ks
0.0f, 1.0f, 1.0f, 0.0f, // tre / vib / sus / ks
0.000000f, 0.330000f, // KSR/8ve
@ -260,7 +293,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_27550[] = {
1.000000f, 0.000000f, // waveforms
0.000000f, 0.066667f, // frq multipliers
0.000000f, // velocity scaling
0.238095f, 0.793651f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 1.0f, 0.0f, 0.0f, // tre / vib / sus / ks
0.0f, 0.0f, 1.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -275,7 +310,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_harpsi[] = {
0.330000f, 0.330000f, // waveforms
0.066667f, 0.200000f, // frq multipliers
0.000000f, // velocity scaling
0.142857f, 0.260000f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 1.0f, 0.0f, // tre / vib / sus / ks
0.0f, 1.0f, 1.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -290,7 +327,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_tromba[] = {
0.000000f, 0.330000f, // waveforms
0.066667f, 0.000000f, // frq multipliers
0.000000f, // velocity scaling
0.142857f, 0.220000f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
0.0f, 0.0f, 1.0f, 0.0f, // tre / vib / sus / ks
1.0f, 0.0f, 1.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -305,7 +344,9 @@ void JuceOplvstiAudioProcessor::initPrograms()
const float i_params_bassdrum[] = {
0.000000f, 1.000000f, // waveforms
0.000000f, 0.000000f, // frq multipliers
0.000000f, // velocity scaling
0.000000f, 0.090000f, // attenuation
0.000000f, 0.000000f, // tremolo / vibrato depth
1.0f, 1.0f, 1.0f, 0.0f, // tre / vib / sus / ks
1.0f, 1.0f, 1.0f, 1.0f, // tre / vib / sus / ks
0.000000f, 0.000000f, // KSR/8ve
@ -380,10 +421,10 @@ void JuceOplvstiAudioProcessor::setParameter (int index, float newValue)
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->SetEnvelopeRelease(c, osc, ((IntFloatParameter*)p)->getParameterValue());
} else if (name.endsWith("Feedback")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->SetModulatorFeedback(c, ((IntFloatParameter*)p)->getParameterValue());
} else if (name.endsWith("KSR")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->SetKsr(c, osc, ((EnumFloatParameter*)p)->getParameterIndex());
} else if (name.endsWith("Keyscaling")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->EnableKeyscaling(c, osc, ((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.endsWith("Keyscale Level")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->SetKsl(c, osc, ((EnumFloatParameter*)p)->getParameterIndex());
} else if (name.endsWith("Keyscale Rate")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->EnableKsr(c, osc, ((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.endsWith("Sustain")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->EnableSustain(c, osc, ((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.endsWith("Tremolo")) {
@ -392,6 +433,12 @@ void JuceOplvstiAudioProcessor::setParameter (int index, float newValue)
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->EnableVibrato(c, osc, ((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.endsWith("Algorithm")) {
for(int c=1;c<=Hiopl::CHANNELS;c++) Opl->EnableAdditiveSynthesis(c, ((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.startsWith("Tremolo Depth")) {
Opl->TremoloDepth(((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.startsWith("Vibrato Depth")) {
Opl->VibratoDepth(((EnumFloatParameter*)p)->getParameterIndex() > 0);
} else if (name.startsWith("Velocity Scaling")) {
velocity = ((EnumFloatParameter*)p)->getParameterIndex() > 0;
}
}
@ -514,7 +561,9 @@ void JuceOplvstiAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuf
while (ch <= Hiopl::CHANNELS && NO_NOTE != active_notes[ch]) {
ch += 1;
}
Opl->SetAttenuation(ch, 2, 63 - (midi_message.getVelocity() / 2));
if (velocity) {
Opl->SetAttenuation(ch, 2, 63 - (midi_message.getVelocity() / 2));
}
Opl->KeyOn(ch, noteHz);
active_notes[ch] = n;
}

View file

@ -78,6 +78,7 @@ private:
std::map<String, std::vector<float>> programs;
std::vector<String> program_order;
int i_program;
bool velocity;
static const int NO_NOTE=-1;
int active_notes[Hiopl::CHANNELS+1]; // keyed by channel

View file

@ -92,7 +92,7 @@ void Hiopl::SetAttenuation(int ch, int osc, int level) {
_WriteReg(0x40+offset, (Bit8u)level, 0x3f);
}
void Hiopl::SetKsr(int ch, int osc, int level) {
void Hiopl::SetKsl(int ch, int osc, int level) {
int offset = this->_GetOffset(ch, osc);
_WriteReg(0x40+offset, (Bit8u)(level<<6), 0xc0);
}
@ -132,12 +132,20 @@ void Hiopl::EnableVibrato(int ch, int osc, bool enable) {
_WriteReg(0x20+offset, enable ? 0x40 : 0x0, 0x40);
}
void Hiopl::TremoloDepth(bool high) {
_WriteReg(0xbd, high ? 0x80 : 0x0, 0x80);
}
void Hiopl::VibratoDepth(bool high) {
_WriteReg(0xbd, high ? 0x40 : 0x0, 0x40);
}
void Hiopl::EnableSustain(int ch, int osc, bool enable) {
int offset = this->_GetOffset(ch, osc);
_WriteReg(0x20+offset, enable ? 0x20 : 0x0, 0x20);
}
void Hiopl::EnableKeyscaling(int ch, int osc, bool enable) {
void Hiopl::EnableKsr(int ch, int osc, bool enable) {
int offset = this->_GetOffset(ch, osc);
_WriteReg(0x20+offset, enable ? 0x10 : 0x0, 0x10);
}

View file

@ -26,14 +26,16 @@ class Hiopl {
void EnableTremolo(int ch, int osc, bool enable);
void EnableVibrato(int ch, int osc, bool enable);
void VibratoDepth(bool high);
void TremoloDepth(bool high);
void EnableSustain(int ch, int osc, bool enable);
void EnableKeyscaling(int ch, int osc, bool enable);
void EnableKsr(int ch, int osc, bool enable);
// true = additive; false = frequency modulation
void EnableAdditiveSynthesis(int ch, bool enable);
void SetWaveform(int ch, int osc, Waveform wave);
void SetAttenuation(int ch, int osc, int level);
void SetKsr(int ch, int osc, int level);
void SetKsl(int ch, int osc, int level);
void SetFrequencyMultiple(int ch, int osc, FreqMultiple mult);
void SetEnvelopeAttack(int ch, int osc, int t);
void SetEnvelopeDecay(int ch, int osc, int t);