From 2dc2879064e9bbc77eeec53141e58d7351e5ba64 Mon Sep 17 00:00:00 2001 From: bruce Date: Thu, 12 Sep 2013 21:10:19 +0800 Subject: [PATCH] Initialise parameters as floating point values. --- Source/PluginProcessor.cpp | 44 ++++++++++++++++++++++++++++---------- Source/hiopl.cpp | 16 +++++--------- Source/hiopl.h | 1 + 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 7d1a0b9..50439a2 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -7,37 +7,52 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor() { Opl = new Hiopl(44100); // 1 second at 44100 + Opl->SetSampleRate(44100); + Opl->EnableSustain(1, 1); + Opl->EnableSustain(1, 2); + const String waveforms[] = {"Sine", "Half Sine", "Abs Sine", "Quarter Sine"}; params.push_back(new EnumFloatParameter("Carrier Wave", StringArray(waveforms, sizeof(waveforms)/sizeof(String))) - ); + ); setParameter(params.size()-1, 0.0f); params.push_back(new EnumFloatParameter("Modulator Wave", StringArray(waveforms, sizeof(waveforms)/sizeof(String))) - ); + ); setParameter(params.size()-1,0.0f); + const String levels[] = {"-0.75 dB", "-1.5 dB", "-3 dB", "-6 dB", "-12 dB", "-24 dB"}; params.push_back(new EnumFloatParameter("Carrier Attenuation", StringArray(levels, sizeof(levels)/sizeof(String))) - ); + ); setParameter(params.size()-1,0.0f); params.push_back(new EnumFloatParameter("Modulator Attenuation", StringArray(levels, sizeof(levels)/sizeof(String))) - ); + ); setParameter(params.size()-1,0.75f); + const String frq_multipliers[] = { "x0.5", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x10", "x12", "x12", "x15", "x15" }; params.push_back(new EnumFloatParameter("Carrier Frequency Multiplier", StringArray(frq_multipliers, sizeof(frq_multipliers)/sizeof(String))) - ); + ); setParameter(params.size()-1, 0.08f); params.push_back(new EnumFloatParameter("Modulator Frequency Multiplier", StringArray(frq_multipliers, sizeof(frq_multipliers)/sizeof(String))) - ); + ); setParameter(params.size()-1, 0.15f); + params.push_back(new IntFloatParameter("Carrier Attack", 0, 15)); - params.push_back(new IntFloatParameter("Carrier Sustain", 0, 15)); + setParameter(params.size()-1,0.5f); params.push_back(new IntFloatParameter("Carrier Decay", 0, 15)); + setParameter(params.size()-1,0.25f); + params.push_back(new IntFloatParameter("Carrier Sustain", 0, 15)); + setParameter(params.size()-1,0.125f); params.push_back(new IntFloatParameter("Carrier Release", 0, 15)); + setParameter(params.size()-1,0.5f); params.push_back(new IntFloatParameter("Modulator Attack", 0, 15)); - params.push_back(new IntFloatParameter("Modulator Sustain", 0, 15)); + setParameter(params.size()-1,0.5f); params.push_back(new IntFloatParameter("Modulator Decay", 0, 15)); + setParameter(params.size()-1,0.25f); + params.push_back(new IntFloatParameter("Modulator Sustain", 0, 15)); + setParameter(params.size()-1,0.25f); params.push_back(new IntFloatParameter("Modulator Release", 0, 15)); + setParameter(params.size()-1,0.25f); } JuceOplvstiAudioProcessor::~JuceOplvstiAudioProcessor() @@ -65,9 +80,9 @@ void JuceOplvstiAudioProcessor::setParameter (int index, float newValue) FloatParameter* p = params[index]; p->setParameter(newValue); String name = p->getName(); - int osc = 1; // Carrier + int osc = 2; // Carrier if (name.startsWith("Modulator")) { - osc = 2; + osc = 1; } if (name.endsWith("Wave")) { Opl->SetWaveform(1, osc, (Waveform)((EnumFloatParameter*)p)->getParameterIndex()); @@ -77,7 +92,14 @@ void JuceOplvstiAudioProcessor::setParameter (int index, float newValue) Opl->SetFrequencyMultiple(1, osc, (FreqMultiple)((EnumFloatParameter*)p)->getParameterIndex()); } else if (name.endsWith("Attack")) { Opl->SetEnvelopeAttack(1, osc, ((IntFloatParameter*)p)->getParameterValue()); + } else if (name.endsWith("Decay")) { + Opl->SetEnvelopeDecay(1, osc, ((IntFloatParameter*)p)->getParameterValue()); + } else if (name.endsWith("Sustain")) { + Opl->SetEnvelopeSustain(1, osc, ((IntFloatParameter*)p)->getParameterValue()); + } else if (name.endsWith("Release")) { + Opl->SetEnvelopeRelease(1, osc, ((IntFloatParameter*)p)->getParameterValue()); } + } const String JuceOplvstiAudioProcessor::getParameterName (int index) @@ -164,7 +186,7 @@ void JuceOplvstiAudioProcessor::changeProgramName (int index, const String& newN //============================================================================== void JuceOplvstiAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { - Opl->SetSampleRate((int)sampleRate); + //Opl->SetSampleRate((int)sampleRate); // Use this method as the place to do any pre-playback // initialisation that you need.. } diff --git a/Source/hiopl.cpp b/Source/hiopl.cpp index 7c4e5d9..79b5855 100644 --- a/Source/hiopl.cpp +++ b/Source/hiopl.cpp @@ -64,17 +64,6 @@ void Hiopl::Generate(int length, float* buffer) { void Hiopl::SetSampleRate(int hz) { adlib->Init(hz); - _WriteReg(0x20,0x32); // modulator multiplier 2 - _WriteReg(0x23,0x21); // carrier multiplier 1 - _WriteReg(0x40,0x1a); // modulator attenuation - _WriteReg(0x43,0x09); // carrier attenuation - _WriteReg(0x60,0x84); // AD - _WriteReg(0x63,0x84); // AD - _WriteReg(0x80,0x29); // SR - _WriteReg(0x83,0x44); // SR - //_WriteReg(0xe3,0x00); // wave select - //_WriteReg(0xe0,0x02); // wave select - //_WriteReg(0xc0,0x06); // carrier self-feedback level } void Hiopl::_WriteReg(Bit32u reg, Bit8u value, Bit8u mask) { @@ -129,6 +118,11 @@ void Hiopl::SetEnvelopeRelease(int ch, int osc, int t) { _WriteReg(0x80+offset, (Bit8u)t, 0x0f); } +void Hiopl::EnableSustain(int ch, int osc) { + int offset = this->_GetOffset(ch, osc); + _WriteReg(0x20+offset, (Bit8u)0x20, 0x20); +} + void Hiopl::KeyOn(int ch, float frqHz) { unsigned int fnum, block; _milliHertzToFnum((unsigned int)(frqHz * 1000.0), &fnum, &block); diff --git a/Source/hiopl.h b/Source/hiopl.h index 603da14..95db478 100644 --- a/Source/hiopl.h +++ b/Source/hiopl.h @@ -31,6 +31,7 @@ class Hiopl { void SetEnvelopeDecay(int ch, int osc, int t); void SetEnvelopeSustain(int ch, int osc, int level); void SetEnvelopeRelease(int ch, int osc, int t); + void EnableSustain(int ch, int osc); void KeyOn(int ch, float frqHz); void KeyOff(int ch); void _WriteReg(Bit32u reg, Bit8u value, Bit8u mask=0x0);