Basics of instrument loading in place.
This commit is contained in:
parent
e5d38e5784
commit
b1d907e9b8
7 changed files with 103 additions and 13 deletions
11
Source/InstrumentLoader.h
Normal file
11
Source/InstrumentLoader.h
Normal file
|
@ -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;
|
||||||
|
};
|
|
@ -1411,7 +1411,7 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
||||||
bool PluginGui::isInterestedInFileDrag (const StringArray& files)
|
bool PluginGui::isInterestedInFileDrag (const StringArray& files)
|
||||||
{
|
{
|
||||||
// TODO: check extensions?
|
// TODO: check extensions?
|
||||||
return true;
|
return 1 == files.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginGui::fileDragEnter (const StringArray& files, int x, int y)
|
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)
|
void PluginGui::filesDropped (const StringArray& files, int x, int y)
|
||||||
{
|
{
|
||||||
|
if (isInterestedInFileDrag(files)) {
|
||||||
|
processor->loadInstrumentFromFile(files[0]);
|
||||||
|
}
|
||||||
//message = "files dropped: " + files.joinIntoString ("\n");
|
//message = "files dropped: " + files.joinIntoString ("\n");
|
||||||
|
|
||||||
//somethingIsBeingDraggedOver = false;
|
//somethingIsBeingDraggedOver = false;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "PluginGui.h"
|
#include "PluginGui.h"
|
||||||
#include "EnumFloatParameter.h"
|
#include "EnumFloatParameter.h"
|
||||||
#include "IntFloatParameter.h"
|
#include "IntFloatParameter.h"
|
||||||
|
#include "SbiLoader.h"
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
|
JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
|
||||||
|
@ -11,7 +12,6 @@ JuceOplvstiAudioProcessor::JuceOplvstiAudioProcessor()
|
||||||
Opl = new Hiopl(44100); // 1 second at 44100
|
Opl = new Hiopl(44100); // 1 second at 44100
|
||||||
Opl->SetSampleRate(44100);
|
Opl->SetSampleRate(44100);
|
||||||
Opl->EnableWaveformControl();
|
Opl->EnableWaveformControl();
|
||||||
//Opl->EnableOpl3Mode();
|
|
||||||
|
|
||||||
// Initialize parameters
|
// 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)
|
const String JuceOplvstiAudioProcessor::getParameterName (int index)
|
||||||
{
|
{
|
||||||
return params[index]->getName();
|
return params[index]->getName();
|
||||||
|
@ -482,12 +513,12 @@ const String JuceOplvstiAudioProcessor::getOutputChannelName (int channelIndex)
|
||||||
|
|
||||||
bool JuceOplvstiAudioProcessor::isInputChannelStereoPair (int index) const
|
bool JuceOplvstiAudioProcessor::isInputChannelStereoPair (int index) const
|
||||||
{
|
{
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JuceOplvstiAudioProcessor::isOutputChannelStereoPair (int index) const
|
bool JuceOplvstiAudioProcessor::isOutputChannelStereoPair (int index) const
|
||||||
{
|
{
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JuceOplvstiAudioProcessor::acceptsMidi() const
|
bool JuceOplvstiAudioProcessor::acceptsMidi() const
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
This file was auto-generated!
|
This file was initially auto-generated by the Introjucer.
|
||||||
|
Now it is safe to edit.
|
||||||
It contains the basic startup code for a Juce application.
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
*/
|
*/
|
||||||
|
@ -40,6 +39,8 @@ public:
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
const String getName() const;
|
const String getName() const;
|
||||||
|
|
||||||
|
static const int JuceOplvstiAudioProcessor::MAX_INSTRUMENT_FILE_SIZE_BYTES = 1024;
|
||||||
|
|
||||||
int getNumParameters();
|
int getNumParameters();
|
||||||
|
|
||||||
float getParameter (int index);
|
float getParameter (int index);
|
||||||
|
@ -48,6 +49,8 @@ public:
|
||||||
void setIntParameter (String name, int newValue);
|
void setIntParameter (String name, int newValue);
|
||||||
int getIntParameter (String name);
|
int getIntParameter (String name);
|
||||||
int getEnumParameter (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 getParameterName (int index);
|
||||||
const String getParameterText (int index);
|
const String getParameterText (int index);
|
||||||
|
@ -87,5 +90,4 @@ private:
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceOplvstiAudioProcessor)
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceOplvstiAudioProcessor)
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PLUGINPROCESSOR_H_INCLUDED
|
#endif // PLUGINPROCESSOR_H_INCLUDED
|
||||||
|
|
34
Source/SbiLoader.cpp
Normal file
34
Source/SbiLoader.cpp
Normal file
|
@ -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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
13
Source/SbiLoader.h
Normal file
13
Source/SbiLoader.h
Normal file
|
@ -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();
|
||||||
|
};
|
||||||
|
|
|
@ -82,10 +82,6 @@ void Hiopl::EnableWaveformControl() {
|
||||||
_WriteReg(0x01, 0x20);
|
_WriteReg(0x01, 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hiopl::EnableOpl3Mode() {
|
|
||||||
_WriteReg(0x105, 0x1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Hiopl::SetWaveform(int ch, int osc, Waveform wave) {
|
void Hiopl::SetWaveform(int ch, int osc, Waveform wave) {
|
||||||
int offset = this->_GetOffset(ch, osc);
|
int offset = this->_GetOffset(ch, osc);
|
||||||
_WriteReg(0xe0+offset, (Bit8u)wave, 0x7);
|
_WriteReg(0xe0+offset, (Bit8u)wave, 0x7);
|
||||||
|
|
Loading…
Reference in a new issue