From b1d907e9b8b4ad9f714f949d3c8aef7597b13950 Mon Sep 17 00:00:00 2001 From: bruce Date: Wed, 13 Nov 2013 17:15:17 +0800 Subject: [PATCH] Basics of instrument loading in place. --- Source/InstrumentLoader.h | 11 +++++++++++ Source/PluginGui.cpp | 5 ++++- Source/PluginProcessor.cpp | 37 ++++++++++++++++++++++++++++++++++--- Source/PluginProcessor.h | 12 +++++++----- Source/SbiLoader.cpp | 34 ++++++++++++++++++++++++++++++++++ Source/SbiLoader.h | 13 +++++++++++++ Source/hiopl.cpp | 4 ---- 7 files changed, 103 insertions(+), 13 deletions(-) create mode 100644 Source/InstrumentLoader.h create mode 100644 Source/SbiLoader.cpp create mode 100644 Source/SbiLoader.h diff --git a/Source/InstrumentLoader.h b/Source/InstrumentLoader.h new file mode 100644 index 0000000..5416298 --- /dev/null +++ b/Source/InstrumentLoader.h @@ -0,0 +1,11 @@ +#pragma once +#include "PluginProcessor.h" + +// Just specifies the interfaces for instrument loaders. + +class InstrumentLoader +{ +public: + virtual void loadInstrumentData(int n, const unsigned char* data, JuceOplvstiAudioProcessor *proc) = 0; + virtual String getExtension() = 0; +}; diff --git a/Source/PluginGui.cpp b/Source/PluginGui.cpp index e822474..e5b1dc2 100644 --- a/Source/PluginGui.cpp +++ b/Source/PluginGui.cpp @@ -1411,7 +1411,7 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked) bool PluginGui::isInterestedInFileDrag (const StringArray& files) { // TODO: check extensions? - return true; + return 1 == files.size(); } void PluginGui::fileDragEnter (const StringArray& files, int x, int y) @@ -1432,6 +1432,9 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked) void PluginGui::filesDropped (const StringArray& files, int x, int y) { + if (isInterestedInFileDrag(files)) { + processor->loadInstrumentFromFile(files[0]); + } //message = "files dropped: " + files.joinIntoString ("\n"); //somethingIsBeingDraggedOver = false; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 1653dd1..ee5ae21 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -2,6 +2,7 @@ #include "PluginGui.h" #include "EnumFloatParameter.h" #include "IntFloatParameter.h" +#include "SbiLoader.h" //============================================================================== JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor() @@ -11,7 +12,6 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor() Opl = new Hiopl(44100); // 1 second at 44100 Opl->SetSampleRate(44100); Opl->EnableWaveformControl(); - //Opl->EnableOpl3Mode(); // Initialize parameters @@ -460,6 +460,37 @@ void JuceOplvstiAudioProcessor::setParameter (int index, float newValue) } } +void JuceOplvstiAudioProcessor::loadInstrumentFromFile(String filename) +{ + FILE* f = fopen(filename.toUTF8(), "rb"); + unsigned char buf[MAX_INSTRUMENT_FILE_SIZE_BYTES]; + int n = fread(buf, 1, MAX_INSTRUMENT_FILE_SIZE_BYTES, f); + SbiLoader* loader = new SbiLoader(); + loader->loadInstrumentData(n, buf, this); + fclose(f); +} + +void JuceOplvstiAudioProcessor::setParametersByRegister(int register_base, int op, uint8 value) +{ + register_base &= 0xF0; + switch (register_base) { + case 0x20: + break; + case 0x40: + break; + case 0x60: + break; + case 0x80: + break; + case 0xC0: + break; + case 0xE0: + break; + default: + break; + } +} + const String JuceOplvstiAudioProcessor::getParameterName (int index) { return params[index]->getName(); @@ -482,12 +513,12 @@ const String JuceOplvstiAudioProcessor::getOutputChannelName (int channelIndex) bool JuceOplvstiAudioProcessor::isInputChannelStereoPair (int index) const { - return true; + return false; } bool JuceOplvstiAudioProcessor::isOutputChannelStereoPair (int index) const { - return true; + return false; } bool JuceOplvstiAudioProcessor::acceptsMidi() const diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index a47870d..61561d2 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -1,9 +1,8 @@ /* ============================================================================== - This file was auto-generated! - - It contains the basic startup code for a Juce application. + This file was initially auto-generated by the Introjucer. + Now it is safe to edit. ============================================================================== */ @@ -40,7 +39,9 @@ public: //============================================================================== const String getName() const; - int getNumParameters(); + static const int JuceOplvstiAudioProcessor::MAX_INSTRUMENT_FILE_SIZE_BYTES = 1024; + + int getNumParameters(); float getParameter (int index); void setParameter (int index, float newValue); @@ -48,6 +49,8 @@ public: void setIntParameter (String name, int newValue); int getIntParameter (String name); int getEnumParameter (String name); + void loadInstrumentFromFile(String filename); + void setParametersByRegister(int register_base, int op, uint8 value); const String getParameterName (int index); const String getParameterText (int index); @@ -87,5 +90,4 @@ private: //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceOplvstiAudioProcessor) }; - #endif // PLUGINPROCESSOR_H_INCLUDED diff --git a/Source/SbiLoader.cpp b/Source/SbiLoader.cpp new file mode 100644 index 0000000..1531598 --- /dev/null +++ b/Source/SbiLoader.cpp @@ -0,0 +1,34 @@ +#include "SbiLoader.h" + + +SbiLoader::SbiLoader(void) +{ +} + +void SbiLoader::loadInstrumentData(int n, const unsigned char* data, JuceOplvstiAudioProcessor *proc) +{ + if (strncmp("SBI", (const char*)data, 3)) { + data += 40; + proc->setParametersByRegister(0x20, 0, data[0]); + proc->setParametersByRegister(0x20, 1, data[1]); + proc->setParametersByRegister(0x40, 0, data[2]); + proc->setParametersByRegister(0x40, 1, data[3]); + proc->setParametersByRegister(0x60, 0, data[4]); + proc->setParametersByRegister(0x60, 1, data[5]); + proc->setParametersByRegister(0x80, 0, data[6]); + proc->setParametersByRegister(0x80, 1, data[7]); + proc->setParametersByRegister(0xE0, 0, data[8]); + proc->setParametersByRegister(0xE0, 1, data[9]); + proc->setParametersByRegister(0xC0, 1, data[10]); + } // else throw "Invalid header"; +} + +String SbiLoader::getExtension() +{ + return String("sbi"); +} + +SbiLoader::~SbiLoader(void) +{ +} + diff --git a/Source/SbiLoader.h b/Source/SbiLoader.h new file mode 100644 index 0000000..2a42ff9 --- /dev/null +++ b/Source/SbiLoader.h @@ -0,0 +1,13 @@ +#pragma once +#include "c:\code\juceoplvsti\source\instrumentloader.h" +class SbiLoader : + public InstrumentLoader +{ +public: + SbiLoader(void); + virtual ~SbiLoader(void); + + void loadInstrumentData(int n, const unsigned char* data, JuceOplvstiAudioProcessor *proc); + String getExtension(); +}; + diff --git a/Source/hiopl.cpp b/Source/hiopl.cpp index 3da4bbe..5c70fe4 100644 --- a/Source/hiopl.cpp +++ b/Source/hiopl.cpp @@ -82,10 +82,6 @@ void Hiopl::EnableWaveformControl() { _WriteReg(0x01, 0x20); } -void Hiopl::EnableOpl3Mode() { - _WriteReg(0x105, 0x1); -} - void Hiopl::SetWaveform(int ch, int osc, Waveform wave) { int offset = this->_GetOffset(ch, osc); _WriteReg(0xe0+offset, (Bit8u)wave, 0x7);