@@ -34,51 +34,35 @@ static const int S2_INPUT = 19; | |||
static const int S3_INPUT = 20; | |||
extern "C" { | |||
SpiralPlugin* SpiralPlugin_CreateInstance() | |||
{ | |||
return new PoshSamplerPlugin; | |||
} | |||
char** SpiralPlugin_GetIcon() | |||
{ | |||
return SpiralIcon_xpm; | |||
} | |||
int SpiralPlugin_GetID() | |||
{ | |||
return 32; | |||
} | |||
string SpiralPlugin_GetGroupName() | |||
{ | |||
return "Delay/Sampling"; | |||
} | |||
SpiralPlugin* SpiralPlugin_CreateInstance() { return new PoshSamplerPlugin; } | |||
char** SpiralPlugin_GetIcon() { return SpiralIcon_xpm; } | |||
int SpiralPlugin_GetID() { return 32; } | |||
string SpiralPlugin_GetGroupName() { return "Delay/Sampling"; } | |||
} | |||
/////////////////////////////////////////////////////// | |||
static void | |||
InitializeSampleDescription(SampleDesc* NewDesc, const string &Pathname, int Note) | |||
{ | |||
if (NewDesc) { | |||
NewDesc->Pathname = Pathname; | |||
NewDesc->Volume = 1.0f; | |||
NewDesc->Velocity = 1.0f; | |||
NewDesc->Pitch = 1.0f; | |||
NewDesc->PitchMod = 1.0f; | |||
NewDesc->SamplePos = -1; | |||
NewDesc->Loop = false; | |||
NewDesc->PingPong = false; | |||
NewDesc->Note = Note; | |||
NewDesc->Octave = 0; | |||
NewDesc->TriggerUp = true; | |||
NewDesc->SamplePos = -1; | |||
NewDesc->SampleRate = 44100; | |||
NewDesc->Stereo = false; | |||
NewDesc->PlayStart = 0; | |||
NewDesc->LoopStart = 0; | |||
NewDesc->LoopEnd = INT_MAX; | |||
} | |||
static void InitializeSampleDescription (SampleDesc* NewDesc, const string &Pathname, int Note) { | |||
if (NewDesc) { | |||
NewDesc->Pathname = Pathname; | |||
NewDesc->Volume = 1.0f; | |||
NewDesc->Velocity = 1.0f; | |||
NewDesc->Pitch = 1.0f; | |||
NewDesc->PitchMod = 1.0f; | |||
NewDesc->SamplePos = -1; | |||
NewDesc->Loop = false; | |||
NewDesc->PingPong = false; | |||
NewDesc->Note = Note; | |||
NewDesc->Octave = 0; | |||
NewDesc->TriggerUp = true; | |||
NewDesc->SamplePos = -1; | |||
NewDesc->SampleRate = 44100; | |||
NewDesc->Stereo = false; | |||
NewDesc->PlayStart = 0; | |||
NewDesc->LoopStart = 0; | |||
NewDesc->LoopEnd = INT_MAX; | |||
NewDesc->ReTrig = true; | |||
} | |||
} | |||
PoshSamplerPlugin::PoshSamplerPlugin() : | |||
@@ -119,22 +103,17 @@ m_Recording(false) | |||
m_PluginInfo.PortTips.push_back("Sample 6 Output"); | |||
m_PluginInfo.PortTips.push_back("Sample 7 Output"); | |||
m_PluginInfo.PortTips.push_back("Sample 8 Output"); | |||
for (int n=0; n<NUM_SAMPLES; n++) | |||
{ | |||
for (int n=0; n<NUM_SAMPLES; n++) { | |||
Sample* NewSample = new Sample; | |||
m_SampleVec.push_back(NewSample); | |||
SampleDesc* NewDesc = new SampleDesc; | |||
char temp[256]; | |||
sprintf (temp, "PoshSampler%d_%d", GetID(), n); | |||
InitializeSampleDescription(NewDesc, temp, n); | |||
m_SampleDescVec.push_back(NewDesc); | |||
} | |||
m_Version=3; | |||
m_Version = 4; | |||
m_Current = 0; | |||
m_AudioCH->Register("Num",&m_GUIArgs.Num); | |||
m_AudioCH->Register("Value",&m_GUIArgs.Value); | |||
m_AudioCH->Register("Bool",&m_GUIArgs.Boole); | |||
@@ -146,268 +125,236 @@ m_Recording(false) | |||
m_AudioCH->Register("PlayPos",&m_CurrentPlayPos,ChannelHandler::OUTPUT); | |||
m_AudioCH->RegisterData("SampleBuffer",ChannelHandler::OUTPUT_REQUEST,&m_SampleBuffer,TRANSBUF_SIZE); | |||
m_AudioCH->Register("SampleSize",&m_SampleSize,ChannelHandler::OUTPUT_REQUEST); | |||
} | |||
PoshSamplerPlugin::~PoshSamplerPlugin() | |||
{ | |||
for (vector<Sample*>::iterator i=m_SampleVec.begin(); | |||
i!=m_SampleVec.end(); i++) | |||
{ | |||
delete(*i); | |||
} | |||
for (vector<SampleDesc*>::iterator i=m_SampleDescVec.begin(); | |||
i!=m_SampleDescVec.end(); i++) | |||
{ | |||
delete(*i); | |||
} | |||
PoshSamplerPlugin::~PoshSamplerPlugin() { | |||
for (vector<Sample*>::iterator i=m_SampleVec.begin(); i!=m_SampleVec.end(); i++) | |||
delete(*i); | |||
for (vector<SampleDesc*>::iterator i=m_SampleDescVec.begin(); i!=m_SampleDescVec.end(); i++) | |||
delete(*i); | |||
} | |||
PluginInfo &PoshSamplerPlugin::Initialise(const HostInfo *Host) | |||
{ | |||
return SpiralPlugin::Initialise(Host);; | |||
PluginInfo &PoshSamplerPlugin::Initialise (const HostInfo *Host) { | |||
return SpiralPlugin::Initialise (Host); | |||
} | |||
SpiralGUIType *PoshSamplerPlugin::CreateGUI() | |||
{ | |||
return new PoshSamplerPluginGUI(m_PluginInfo.Width, | |||
m_PluginInfo.Height, | |||
this,m_AudioCH,m_HostInfo); | |||
SpiralGUIType *PoshSamplerPlugin::CreateGUI() { | |||
return new PoshSamplerPluginGUI (m_PluginInfo.Width, m_PluginInfo.Height, this, m_AudioCH, m_HostInfo); | |||
} | |||
void PoshSamplerPlugin::Reset() | |||
{ | |||
ResetPorts(); | |||
m_Current = 0; | |||
for (int s=0; s<NUM_SAMPLES; s++) | |||
{ | |||
m_SampleDescVec[s]->Pitch = m_InitialPitch[s] * m_SampleDescVec[s]->SampleRate/(float)m_HostInfo->SAMPLERATE; | |||
m_SampleDescVec[s]->LoopEnd=m_SampleVec[s]->GetLength()-1; | |||
} | |||
void PoshSamplerPlugin::Reset() { | |||
ResetPorts(); | |||
m_Current = 0; | |||
for (int s=0; s<NUM_SAMPLES; s++) { | |||
m_SampleDescVec[s]->Pitch = m_InitialPitch[s] * m_SampleDescVec[s]->SampleRate / (float)m_HostInfo->SAMPLERATE; | |||
m_SampleDescVec[s]->LoopEnd = m_SampleVec[s]->GetLength() - 1; | |||
} | |||
} | |||
void PoshSamplerPlugin::Execute() | |||
{ | |||
static bool Pong=false; | |||
for (int s=0; s<NUM_SAMPLES+1; s++) | |||
{ | |||
GetOutputBuf(s)->Zero(); | |||
} | |||
float Freq=0; | |||
for (int n=0; n<m_HostInfo->BUFSIZE; n++) | |||
{ | |||
Freq=GetInputPitch(NOTETRIG,n); | |||
for (int s=0; s<NUM_SAMPLES; s++) | |||
{ | |||
SampleDesc* S=m_SampleDescVec[s]; | |||
// if we have a sample here | |||
if (m_SampleVec[s]->GetLength()) | |||
{ | |||
// Convert the CV input into a useable trigger | |||
if (GetInput(s*2+1,n)>0 || feq(Freq,NoteTable[S->Note],0.01f)) | |||
{ | |||
if (S->TriggerUp) | |||
{ | |||
if (s==0 && InputExists(S1_INPUT)) | |||
S->PlayStart=(long int)((GetInput(S1_INPUT,n)*0.5+0.5f)*(S->LoopEnd-S->LoopStart))+S->LoopStart; | |||
if (s==1 && InputExists(S2_INPUT)) | |||
S->PlayStart=(long int)((GetInput(S2_INPUT,n)*0.5+0.5f)*(S->LoopEnd-S->LoopStart))+S->LoopStart; | |||
if (s==2 && InputExists(S3_INPUT)) | |||
S->PlayStart=(long int)((GetInput(S3_INPUT,n)*0.5+0.5f)*(S->LoopEnd-S->LoopStart))+S->LoopStart; | |||
if (S->PlayStart<0) S->PlayStart=0; | |||
S->SamplePos=S->PlayStart; | |||
S->TriggerUp=false; | |||
S->Velocity=GetInput(s*2+1,n); | |||
} | |||
} | |||
else | |||
{ | |||
S->TriggerUp=true; | |||
// end it if it's looping | |||
if (S->Loop) | |||
{ | |||
S->SamplePos=-1; | |||
} | |||
} | |||
// if the sample has ended | |||
if (S->SamplePos>=S->LoopEnd || S->SamplePos>=m_SampleVec[s]->GetLength()) | |||
{ | |||
if (S->Loop) | |||
{ | |||
if (S->PingPong) Pong=true; | |||
else S->SamplePos=S->LoopStart; | |||
} | |||
else | |||
{ | |||
S->SamplePos=-1; | |||
} | |||
} | |||
// if the sample has ended ponging | |||
if (Pong && S->SamplePos<=S->LoopStart) | |||
{ | |||
Pong=false; | |||
} | |||
if (S->SamplePos!=-1) | |||
{ | |||
if (InputExists(s*2)) | |||
{ | |||
// Get the pitch from the CV | |||
float PlayFreq=GetInputPitch(s*2,n); | |||
// assumtion: base frequency = 440 (middle A) | |||
S->Pitch = PlayFreq/440; | |||
S->Pitch *= S->SampleRate/(float)m_HostInfo->SAMPLERATE; | |||
} | |||
// mix the sample to the output. | |||
MixOutput(0,n,(*m_SampleVec[s])[S->SamplePos]*S->Volume*S->Velocity); | |||
// copy the sample to it's individual output. | |||
SetOutput(s+1,n,((*m_SampleVec[s])[S->SamplePos]*S->Volume)); | |||
float Freq=S->Pitch; | |||
if (S->Octave>0) Freq*=1<<(S->Octave); | |||
if (S->Octave<0) Freq/=1<<(-S->Octave); | |||
if (Pong) S->SamplePos-=Freq*S->PitchMod; | |||
else S->SamplePos+=Freq*S->PitchMod; | |||
} | |||
} | |||
} | |||
} | |||
// record | |||
static int LastRecording=false; | |||
if(m_Recording && InputExists(REC_INPUT)) | |||
{ | |||
int s=0;//GUI->GetCurrentSample(); | |||
if (!LastRecording) m_SampleVec[s]->Clear(); | |||
// new sample | |||
if (m_SampleVec[s]->GetLength()==0) | |||
{ | |||
*m_SampleVec[s]=*GetInput(REC_INPUT); | |||
m_SampleDescVec[s]->SampleRate=m_HostInfo->SAMPLERATE; | |||
m_SampleDescVec[s]->Stereo=false; | |||
m_SampleDescVec[s]->Pitch *= 1.0f; | |||
m_InitialPitch[s] = m_SampleDescVec[s]->Pitch; | |||
m_SampleDescVec[s]->LoopEnd=m_SampleVec[s]->GetLength(); | |||
} | |||
else | |||
{ | |||
m_SampleVec[s]->Add(*GetInput(REC_INPUT)); | |||
m_SampleDescVec[s]->LoopEnd=m_SampleVec[s]->GetLength(); | |||
} | |||
} | |||
LastRecording=m_Recording; | |||
if (m_SampleDescVec[m_Current]->SamplePos>0) | |||
{ | |||
m_CurrentPlayPos=(long)m_SampleDescVec[m_Current]->SamplePos; | |||
} | |||
void PoshSamplerPlugin::Execute() { | |||
static bool Pong = false; | |||
for (int s=0; s<NUM_SAMPLES+1; s++) GetOutputBuf (s)->Zero(); | |||
float Freq = 0; | |||
for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | |||
Freq = GetInputPitch (NOTETRIG, n); | |||
for (int s=0; s<NUM_SAMPLES; s++) { | |||
SampleDesc *S = m_SampleDescVec[s]; | |||
// if we have a sample here | |||
if (m_SampleVec[s]->GetLength()) { | |||
// Convert the CV input into a useable trigger | |||
if (S->ReTrig || (S->SamplePos == -1)) { | |||
if (GetInput (s*2 + 1, n) > 0 || feq (Freq, NoteTable[S->Note], 0.01f)) { | |||
if (S->TriggerUp) { | |||
if (s==0 && InputExists (S1_INPUT)) | |||
S->PlayStart = (long int)((GetInput (S1_INPUT, n) * 0.5 + 0.5f) * (S->LoopEnd-S->LoopStart)) + S->LoopStart; | |||
if (s==1 && InputExists (S2_INPUT)) | |||
S->PlayStart = (long int)((GetInput (S2_INPUT, n) * 0.5 + 0.5f) * (S->LoopEnd-S->LoopStart)) + S->LoopStart; | |||
if (s==2 && InputExists (S3_INPUT)) | |||
S->PlayStart = (long int)((GetInput (S3_INPUT, n) * 0.5 + 0.5f) * (S->LoopEnd-S->LoopStart)) + S->LoopStart; | |||
if (S->PlayStart < 0) S->PlayStart = 0; | |||
S->SamplePos = S->PlayStart; | |||
S->TriggerUp = false; | |||
S->Velocity = GetInput (s * 2 + 1, n); | |||
} | |||
} | |||
else { | |||
S->TriggerUp = true; | |||
// end it if it's looping | |||
if (S->Loop) S->SamplePos = -1; | |||
} | |||
} | |||
// if the sample has ended | |||
if (S->SamplePos >= S->LoopEnd || S->SamplePos >= m_SampleVec[s]->GetLength()) { | |||
if (S->Loop) { | |||
if (S->PingPong) Pong = true; | |||
else S->SamplePos = S->LoopStart; | |||
} | |||
else { | |||
S->SamplePos = -1; | |||
} | |||
} | |||
// if the sample has ended ponging | |||
if (Pong && S->SamplePos <= S->LoopStart) | |||
Pong = false; | |||
if (S->SamplePos != -1) { | |||
if (InputExists (s * 2)) { | |||
// Get the pitch from the CV | |||
float PlayFreq = GetInputPitch (s * 2, n); | |||
// assumtion: base frequency = 440 (middle A) | |||
S->Pitch = PlayFreq / 440; | |||
S->Pitch *= S->SampleRate / (float)m_HostInfo->SAMPLERATE; | |||
} | |||
// mix the sample to the output. | |||
MixOutput (0, n, (*m_SampleVec[s])[S->SamplePos] * S->Volume * S->Velocity); | |||
// copy the sample to it's individual output. | |||
SetOutput (s + 1, n, ((*m_SampleVec[s])[S->SamplePos] * S->Volume)); | |||
float Freq = S->Pitch; | |||
if (S->Octave > 0) Freq *= 1 << (S->Octave); | |||
if (S->Octave < 0) Freq /= 1 << (-S->Octave); | |||
if (Pong) S->SamplePos -= Freq * S->PitchMod; | |||
else S->SamplePos += Freq * S->PitchMod; | |||
} | |||
} | |||
} | |||
} | |||
// record | |||
static int LastRecording = false; | |||
if (m_Recording && InputExists (REC_INPUT)) { | |||
int s = 0; //GUI->GetCurrentSample(); | |||
if (!LastRecording) m_SampleVec[s]->Clear(); | |||
// new sample | |||
if (m_SampleVec[s]->GetLength() == 0) { | |||
*m_SampleVec[s] =* GetInput (REC_INPUT); | |||
m_SampleDescVec[s]->SampleRate = m_HostInfo->SAMPLERATE; | |||
m_SampleDescVec[s]->Stereo = false; | |||
m_SampleDescVec[s]->Pitch *= 1.0f; | |||
m_InitialPitch[s] = m_SampleDescVec[s]->Pitch; | |||
m_SampleDescVec[s]->LoopEnd = m_SampleVec[s]->GetLength(); | |||
} | |||
else { | |||
m_SampleVec[s]->Add (*GetInput (REC_INPUT)); | |||
m_SampleDescVec[s]->LoopEnd = m_SampleVec[s]->GetLength(); | |||
} | |||
} | |||
LastRecording = m_Recording; | |||
if (m_SampleDescVec[m_Current]->SamplePos > 0) { | |||
m_CurrentPlayPos = (long)m_SampleDescVec[m_Current]->SamplePos; | |||
} | |||
} | |||
void PoshSamplerPlugin::ExecuteCommands() | |||
{ | |||
if (m_AudioCH->IsCommandWaiting()) | |||
{ | |||
switch(m_AudioCH->GetCommand()) | |||
{ | |||
case (LOAD) : LoadSample(m_GUIArgs.Num,m_GUIArgs.Name); break; | |||
case (SAVE) : SaveSample(m_GUIArgs.Num,m_GUIArgs.Name); break; | |||
case (SETVOL) : SetVolume(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
case (SETPITCH) : SetPitch(m_GUIArgs.Num,m_GUIArgs.Value); break; | |||
case (SETLOOP) : SetLoop(m_GUIArgs.Num,m_GUIArgs.Boole); break; | |||
case (SETPING) : SetPingPong(m_GUIArgs.Num,m_GUIArgs.Boole); break; | |||
case (SETNOTE) : SetNote(m_GUIArgs.Num,m_GUIArgs.Int); break; | |||
case (SETOCT) : SetOctave(m_GUIArgs.Num,m_GUIArgs.Int); break; | |||
case (SETPLAYPOINTS): | |||
{ | |||
SetPlayStart(m_GUIArgs.Num,m_GUIArgs.Start); | |||
SetLoopStart(m_GUIArgs.Num,m_GUIArgs.LoopStart); | |||
SetLoopEnd(m_GUIArgs.Num,m_GUIArgs.End); | |||
} break; | |||
case (SETREC) : SetRecord(m_GUIArgs.Boole); break; | |||
case (CUT) : Cut(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (COPY) : Copy(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (PASTE) : Paste(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (MIX) : Mix(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (CROP) : Crop(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (REV) : Reverse(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (AMP) : Amp(m_GUIArgs.Num,m_GUIArgs.Start,m_GUIArgs.End); break; | |||
case (SETCURRENT) : m_Current = m_GUIArgs.Num; break; | |||
case (GETSAMPLE) : | |||
{ | |||
m_AudioCH->SetupBulkTransfer((void*)m_SampleVec[m_Current]->GetBuffer()); | |||
m_SampleSize=m_SampleVec[m_Current]->GetLengthInBytes(); | |||
} break; | |||
}; | |||
} | |||
void PoshSamplerPlugin::ExecuteCommands() { | |||
if (m_AudioCH->IsCommandWaiting()) { | |||
switch (m_AudioCH->GetCommand()) { | |||
case LOAD: | |||
LoadSample(m_GUIArgs.Num,m_GUIArgs.Name); | |||
break; | |||
case SAVE: | |||
SaveSample(m_GUIArgs.Num,m_GUIArgs.Name); | |||
break; | |||
case SETVOL: | |||
m_SampleDescVec[m_GUIArgs.Num]->Volume=m_GUIArgs.Value; | |||
break; | |||
case SETPITCH: | |||
m_SampleDescVec[m_GUIArgs.Num]->PitchMod=m_GUIArgs.Value; | |||
break; | |||
case SETLOOP: | |||
m_SampleDescVec[m_GUIArgs.Num]->Loop=m_GUIArgs.Boole; | |||
break; | |||
case SETPING: | |||
m_SampleDescVec[m_GUIArgs.Num]->PingPong=m_GUIArgs.Boole; | |||
break; | |||
case SETNOTE: | |||
m_SampleDescVec[m_GUIArgs.Num]->Note=m_GUIArgs.Int; | |||
break; | |||
case SETOCT: | |||
m_SampleDescVec[m_GUIArgs.Num]->Octave=m_GUIArgs.Int-6; | |||
break; | |||
case SETPLAYPOINTS: | |||
m_SampleDescVec[m_GUIArgs.Num]->PlayStart=m_GUIArgs.Start; | |||
m_SampleDescVec[m_GUIArgs.Num]->LoopStart=m_GUIArgs.LoopStart; | |||
m_SampleDescVec[m_GUIArgs.Num]->LoopEnd=m_GUIArgs.End; | |||
break; | |||
case SETREC: | |||
m_Recording=m_GUIArgs.Boole; | |||
break; | |||
case CUT: | |||
Cut (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case COPY: | |||
Copy (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case PASTE: | |||
Paste (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case MIX: | |||
Mix (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case CROP: | |||
Crop (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case REV: | |||
Reverse (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case AMP: | |||
Amp (m_GUIArgs.Num, m_GUIArgs.Start, m_GUIArgs.End); | |||
break; | |||
case SETCURRENT: | |||
m_Current = m_GUIArgs.Num; | |||
break; | |||
case GETSAMPLE: | |||
m_AudioCH->SetupBulkTransfer ((void*)m_SampleVec[m_Current]->GetBuffer()); | |||
m_SampleSize = m_SampleVec[m_Current]->GetLengthInBytes(); | |||
break; | |||
case SETRETRIG: | |||
m_SampleDescVec[m_GUIArgs.Num]->ReTrig=m_GUIArgs.Boole; | |||
break; | |||
}; | |||
} | |||
} | |||
void PoshSamplerPlugin::StreamOut(ostream &s) | |||
{ | |||
s<<m_Version<<" "; | |||
for (int n=0; n<NUM_SAMPLES; n++) | |||
{ | |||
s<<m_SampleDescVec[n]->Volume<<" "<< | |||
m_SampleDescVec[n]->PitchMod<<" "<< | |||
m_SampleDescVec[n]->Loop<<" "<< | |||
m_SampleDescVec[n]->PingPong<<" "<< | |||
m_SampleDescVec[n]->Note<<" "<< | |||
m_SampleDescVec[n]->Octave<<" "<< | |||
m_SampleDescVec[n]->SamplePos<<" "<< | |||
m_SampleDescVec[n]->PlayStart<<" "<< | |||
m_SampleDescVec[n]->LoopStart<<" "<< | |||
m_SampleDescVec[n]->LoopEnd<<" "<< | |||
m_SampleDescVec[n]->Note<<" "; | |||
} | |||
void PoshSamplerPlugin::StreamOut (ostream &s) { | |||
s << m_Version << " "; | |||
for (int n=0; n<NUM_SAMPLES; n++) { | |||
s << m_SampleDescVec[n]->Volume << " " << | |||
m_SampleDescVec[n]->PitchMod << " " << | |||
m_SampleDescVec[n]->Loop << " " << | |||
m_SampleDescVec[n]->PingPong << " " << | |||
m_SampleDescVec[n]->Note << " " << | |||
m_SampleDescVec[n]->Octave << " " << | |||
m_SampleDescVec[n]->SamplePos << " " << | |||
m_SampleDescVec[n]->PlayStart << " " << | |||
m_SampleDescVec[n]->LoopStart << " " << | |||
m_SampleDescVec[n]->LoopEnd << " " << | |||
m_SampleDescVec[n]->Note << " " << | |||
m_SampleDescVec[n]->ReTrig << " "; | |||
} | |||
} | |||
void PoshSamplerPlugin::StreamIn(istream &s) | |||
{ | |||
int version; | |||
s>>version; | |||
for (int n=0; n<NUM_SAMPLES; n++) | |||
{ | |||
s>>m_SampleDescVec[n]->Volume>> | |||
m_SampleDescVec[n]->PitchMod>> | |||
m_SampleDescVec[n]->Loop>> | |||
m_SampleDescVec[n]->PingPong>> | |||
m_SampleDescVec[n]->Note>> | |||
m_SampleDescVec[n]->Octave>> | |||
m_SampleDescVec[n]->SamplePos>> | |||
m_SampleDescVec[n]->PlayStart>> | |||
m_SampleDescVec[n]->LoopStart>> | |||
m_SampleDescVec[n]->LoopEnd>> | |||
m_SampleDescVec[n]->Note; | |||
if (version<3) | |||
{ | |||
int size; | |||
s>>size; | |||
s.ignore(1); | |||
char Buf[4096]; | |||
s.get(Buf,size+1); | |||
} | |||
} | |||
void PoshSamplerPlugin::StreamIn (istream &s) { | |||
int version; | |||
s >> version; | |||
for (int n=0; n<NUM_SAMPLES; n++) { | |||
s >> m_SampleDescVec[n]->Volume >> | |||
m_SampleDescVec[n]->PitchMod >> | |||
m_SampleDescVec[n]->Loop >> | |||
m_SampleDescVec[n]->PingPong >> | |||
m_SampleDescVec[n]->Note >> | |||
m_SampleDescVec[n]->Octave >> | |||
m_SampleDescVec[n]->SamplePos >> | |||
m_SampleDescVec[n]->PlayStart >> | |||
m_SampleDescVec[n]->LoopStart >> | |||
m_SampleDescVec[n]->LoopEnd >> | |||
m_SampleDescVec[n]->Note; | |||
if (version < 3) { | |||
int size; | |||
s >> size; | |||
s.ignore (1); | |||
char Buf[4096]; | |||
s.get (Buf, size+1); | |||
} | |||
if (version > 3) s >> m_SampleDescVec[n]->ReTrig; | |||
else m_SampleDescVec[n]->ReTrig = true; | |||
} | |||
} | |||
void PoshSamplerPlugin::LoadSample(int n, const string &Name) | |||
@@ -14,123 +14,84 @@ | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program; if not, write to the Free Software | |||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
#include "../SpiralPlugin.h" | |||
#include <FL/Fl_Pixmap.H> | |||
*/ | |||
#ifndef PoshSamplerPLUGIN | |||
#define PoshSamplerPLUGIN | |||
#include "../SpiralPlugin.h" | |||
#include <FL/Fl_Pixmap.H> | |||
static const int NUM_SAMPLES = 8; | |||
static const int TRANSBUF_SIZE = 0x10000; | |||
struct SampleDesc | |||
{ | |||
std::string Pathname; | |||
float Volume; | |||
float Velocity; | |||
float Pitch; | |||
float PitchMod; | |||
bool Loop; | |||
bool PingPong; | |||
int Note; | |||
int Octave; | |||
bool TriggerUp; | |||
float SamplePos; | |||
int SampleRate; | |||
bool Stereo; | |||
long PlayStart; | |||
long LoopStart; | |||
long LoopEnd; | |||
struct SampleDesc { | |||
std::string Pathname; | |||
float Volume, Velocity, Pitch, PitchMod; | |||
bool Loop, PingPong; | |||
int Note, Octave; | |||
bool TriggerUp; | |||
float SamplePos; | |||
int SampleRate; | |||
bool Stereo; | |||
long PlayStart, LoopStart, LoopEnd; | |||
bool ReTrig; | |||
}; | |||
class PoshSamplerPlugin : public SpiralPlugin | |||
{ | |||
public: | |||
PoshSamplerPlugin(); | |||
virtual ~PoshSamplerPlugin(); | |||
virtual PluginInfo &Initialise(const HostInfo *Host); | |||
virtual SpiralGUIType *CreateGUI(); | |||
virtual void Execute(); | |||
virtual void Reset(); | |||
virtual void ExecuteCommands(); | |||
virtual void StreamOut(std::ostream &s); | |||
virtual void StreamIn(std::istream &s); | |||
virtual bool SaveExternalFiles(const std::string &Dir); | |||
virtual void LoadExternalFiles(const std::string &Dir, int withID=-1); | |||
enum GUICommands{NONE,LOAD,SAVE,SETVOL,SETPITCH,SETLOOP,SETPING,SETNOTE,SETOCT, | |||
SETPLAYPOINTS,SETREC,CUT,COPY,PASTE,CROP,MIX,REV,AMP,SETCURRENT, | |||
GETSAMPLE}; | |||
struct GUIArgs | |||
{ | |||
int Num; | |||
float Value; | |||
bool Boole; | |||
int Int; | |||
long Start; | |||
long End; | |||
long LoopStart; | |||
char Name[256]; | |||
}; | |||
void LoadSample(int n, const std::string &Name); | |||
void SaveSample(int n, const std::string &Name); | |||
Sample* GetSample(int n) { return m_SampleVec[n]; } | |||
float GetVolume(int n) { return m_SampleDescVec[n]->Volume; } | |||
float GetPitch(int n) { return m_SampleDescVec[n]->PitchMod; } | |||
bool GetLoop(int n) { return m_SampleDescVec[n]->Loop; } | |||
bool GetPingPong(int n) { return m_SampleDescVec[n]->PingPong; } | |||
int GetNote(int n) { return m_SampleDescVec[n]->Note; } | |||
int GetOctave(int n) { return m_SampleDescVec[n]->Octave+6; } | |||
long GetPlayStart(int n) { return m_SampleDescVec[n]->PlayStart; } | |||
long GetLoopStart(int n) { return m_SampleDescVec[n]->LoopStart; } | |||
long GetLoopEnd(int n) { return m_SampleDescVec[n]->LoopEnd; } | |||
std::vector<Sample*> m_SampleVec; | |||
std::vector<SampleDesc*> m_SampleDescVec; | |||
private: | |||
void SetVolume(int n, float s) { m_SampleDescVec[n]->Volume=s; } | |||
void SetPitch(int n, float s) { m_SampleDescVec[n]->PitchMod=s; } | |||
void SetLoop(int n, bool s) { m_SampleDescVec[n]->Loop=s; } | |||
void SetPingPong(int n, bool s){ m_SampleDescVec[n]->PingPong=s; } | |||
void SetNote(int n, int s) { m_SampleDescVec[n]->Note=s; } | |||
void SetOctave(int n, int s) { m_SampleDescVec[n]->Octave=s-6; } | |||
void SetPlayStart(int n, long s) { m_SampleDescVec[n]->PlayStart=s; } | |||
void SetLoopStart(int n, long s) { m_SampleDescVec[n]->LoopStart=s; } | |||
void SetLoopEnd(int n, long s) { m_SampleDescVec[n]->LoopEnd=s; } | |||
void SetRecord(bool s) { m_Recording=s; } | |||
void Cut(int n, long s, long e); | |||
void Copy(int n, long s, long e); | |||
void Paste(int n, long s, long e); | |||
void Mix(int n, long s, long e); | |||
void Crop(int n, long s, long e); | |||
void Reverse(int n, long s, long e); | |||
void Amp(int n, long s, long e); | |||
int m_Current; | |||
GUIArgs m_GUIArgs; | |||
Sample m_CopyBuffer; | |||
bool m_Recording; | |||
char m_SampleBuffer[TRANSBUF_SIZE]; | |||
long m_SampleSize; | |||
long m_CurrentPlayPos; | |||
float m_InitialPitch[NUM_SAMPLES]; | |||
class PoshSamplerPlugin : public SpiralPlugin { | |||
public: | |||
PoshSamplerPlugin(); | |||
virtual ~PoshSamplerPlugin(); | |||
virtual PluginInfo &Initialise (const HostInfo *Host); | |||
virtual SpiralGUIType *CreateGUI(); | |||
virtual void Execute(); | |||
virtual void Reset(); | |||
virtual void ExecuteCommands(); | |||
virtual void StreamOut (std::ostream &s); | |||
virtual void StreamIn (std::istream &s); | |||
virtual bool SaveExternalFiles (const std::string &Dir); | |||
virtual void LoadExternalFiles (const std::string &Dir, int withID=-1); | |||
enum GUICommands {NONE, LOAD, SAVE, SETVOL, SETPITCH, SETLOOP, SETPING, SETNOTE, SETOCT, | |||
SETPLAYPOINTS, SETREC, CUT, COPY, PASTE, CROP, MIX, REV, AMP, SETCURRENT, | |||
GETSAMPLE, SETRETRIG}; | |||
struct GUIArgs { | |||
int Num; | |||
float Value; | |||
bool Boole; | |||
int Int; | |||
long Start, End, LoopStart; | |||
char Name[256]; | |||
}; | |||
void LoadSample (int n, const std::string &Name); | |||
void SaveSample (int n, const std::string &Name); | |||
Sample* GetSample (int n) { return m_SampleVec[n]; } | |||
float GetVolume (int n) { return m_SampleDescVec[n]->Volume; } | |||
float GetPitch (int n) { return m_SampleDescVec[n]->PitchMod; } | |||
bool GetReTrig (int n) { return m_SampleDescVec[n]->ReTrig; } | |||
bool GetLoop (int n) { return m_SampleDescVec[n]->Loop; } | |||
bool GetPingPong (int n) { return m_SampleDescVec[n]->PingPong; } | |||
int GetNote (int n) { return m_SampleDescVec[n]->Note; } | |||
int GetOctave (int n) { return m_SampleDescVec[n]->Octave+6; } | |||
long GetPlayStart (int n) { return m_SampleDescVec[n]->PlayStart; } | |||
long GetLoopStart (int n) { return m_SampleDescVec[n]->LoopStart; } | |||
long GetLoopEnd (int n) { return m_SampleDescVec[n]->LoopEnd; } | |||
std::vector<Sample*> m_SampleVec; | |||
std::vector<SampleDesc*> m_SampleDescVec; | |||
private: | |||
void Cut (int n, long s, long e); | |||
void Copy (int n, long s, long e); | |||
void Paste (int n, long s, long e); | |||
void Mix (int n, long s, long e); | |||
void Crop (int n, long s, long e); | |||
void Reverse (int n, long s, long e); | |||
void Amp (int n, long s, long e); | |||
int m_Current; | |||
GUIArgs m_GUIArgs; | |||
Sample m_CopyBuffer; | |||
bool m_Recording; | |||
char m_SampleBuffer[TRANSBUF_SIZE]; | |||
long m_SampleSize, m_CurrentPlayPos; | |||
float m_InitialPitch[NUM_SAMPLES]; | |||
}; | |||
#endif |
@@ -255,7 +255,7 @@ void Fl_WaveDisplay::ZoomIn() | |||
void Fl_WaveDisplay::ZoomOut() | |||
{ | |||
int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f); | |||
m_ViewStart-=Zoom; | |||
m_ViewStart-=Zoom; | |||
m_ViewEnd+=Zoom; | |||
redraw(); | |||
} | |||
@@ -265,10 +265,10 @@ void Fl_WaveDisplay::ZoomOut() | |||
PoshSamplerPluginGUI::PoshSamplerPluginGUI(int w, int h,PoshSamplerPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
SpiralPluginGUI(w,h,o,ch), | |||
m_UpdateMe(false) | |||
{ | |||
int n=0; | |||
{ | |||
int n=0; | |||
m_Load = new Fl_Button(5, 20, 70, 20, "Load"); | |||
m_Load = new Fl_Button(5, 20, 50, 20, "Load"); | |||
m_Load->labelsize(10); | |||
m_Load->box (FL_PLASTIC_UP_BOX); | |||
m_Load->color (Info->GUI_COLOUR); | |||
@@ -276,7 +276,7 @@ m_UpdateMe(false) | |||
m_Load->callback((Fl_Callback*)cb_Load); | |||
add(m_Load); | |||
m_Save = new Fl_Button(5, 40, 70, 20, "Save"); | |||
m_Save = new Fl_Button(55, 20, 50, 20, "Save"); | |||
m_Save->labelsize(10); | |||
m_Save->box (FL_PLASTIC_UP_BOX); | |||
m_Save->color (Info->GUI_COLOUR); | |||
@@ -284,7 +284,7 @@ m_UpdateMe(false) | |||
m_Save->callback((Fl_Callback*)cb_Save); | |||
add(m_Save); | |||
m_Record = new Fl_Button(5, 60, 70, 20, "Record"); | |||
m_Record = new Fl_Button(105, 20, 50, 20, "Record"); | |||
m_Record->type (FL_TOGGLE_BUTTON); | |||
m_Record->box (FL_PLASTIC_UP_BOX); | |||
m_Record->color (FL_RED); | |||
@@ -294,7 +294,7 @@ m_UpdateMe(false) | |||
m_Record->callback((Fl_Callback*)cb_Record); | |||
add(m_Record); | |||
m_Loop = new Fl_Button(80, 20, 70, 20, "Loop"); | |||
m_Loop = new Fl_Button(5, 40, 75, 20, "Loop"); | |||
m_Loop->type (FL_TOGGLE_BUTTON); | |||
m_Loop->labelsize(10); | |||
m_Loop->box (FL_PLASTIC_UP_BOX); | |||
@@ -303,8 +303,7 @@ m_UpdateMe(false) | |||
m_Loop->callback((Fl_Callback*)cb_Loop); | |||
add(m_Loop); | |||
m_PingPong = new Fl_Button(80, 40, 70, 20, "PingPong"); | |||
m_PingPong->labelsize(10); | |||
m_PingPong = new Fl_Button(80, 40, 75, 20, "PingPong"); | |||
m_PingPong->type (FL_TOGGLE_BUTTON); | |||
m_PingPong->labelsize(10); | |||
m_PingPong->box (FL_PLASTIC_UP_BOX); | |||
@@ -313,8 +312,7 @@ m_UpdateMe(false) | |||
m_PingPong->callback((Fl_Callback*)cb_PingPong); | |||
add(m_PingPong); | |||
m_PosMarker = new Fl_Button(80, 60, 70, 20, "PosMarker"); | |||
m_PosMarker->labelsize(10); | |||
m_PosMarker = new Fl_Button(5, 60, 75, 20, "PosMarker"); | |||
m_PosMarker->type (FL_TOGGLE_BUTTON); | |||
m_PosMarker->labelsize(10); | |||
m_PosMarker->box (FL_PLASTIC_UP_BOX); | |||
@@ -324,6 +322,16 @@ m_UpdateMe(false) | |||
m_PosMarker->callback((Fl_Callback*)cb_PosMarker); | |||
add(m_PosMarker); | |||
m_Retrig = new Fl_Button (80, 60, 75, 20, "Re-Trigger"); | |||
m_Retrig->type (FL_TOGGLE_BUTTON); | |||
m_Retrig->labelsize (10); | |||
m_Retrig->box (FL_PLASTIC_UP_BOX); | |||
m_Retrig->color (Info->GUI_COLOUR); | |||
m_Retrig->selection_color (Info->GUI_COLOUR); | |||
m_Retrig->value (1); | |||
m_Retrig->callback ((Fl_Callback*)cb_Retrig); | |||
add (m_Retrig); | |||
m_Volume = new Fl_Knob(160, 20, 50, 50, "Volume"); | |||
m_Volume->color(Info->GUI_COLOUR); | |||
m_Volume->type(Fl_Knob::LINELIN); | |||
@@ -487,11 +495,11 @@ void PoshSamplerPluginGUI::Update() | |||
void PoshSamplerPluginGUI::UpdateValues(SpiralPlugin *o) | |||
{ | |||
PoshSamplerPlugin *Plugin = (PoshSamplerPlugin*)o; | |||
m_Volume->value(Plugin->GetVolume((int)m_SampleNum->value())); | |||
m_Pitch->value(Plugin->GetPitch((int)m_SampleNum->value())); | |||
m_Note->value(Plugin->GetNote((int)m_SampleNum->value())); | |||
m_Loop->value(Plugin->GetLoop((int)m_SampleNum->value())); | |||
m_Retrig->value(Plugin->GetReTrig((int)m_SampleNum->value())); | |||
m_UpdateMe=true; | |||
m_Display->SetPlayStart(Plugin->GetPlayStart((int)m_SampleNum->value())); | |||
m_Display->SetLoopStart(Plugin->GetLoopStart((int)m_SampleNum->value())); | |||
@@ -522,7 +530,7 @@ void PoshSamplerPluginGUI::cb_Load(Fl_Button* o, void* v) | |||
inline void PoshSamplerPluginGUI::cb_Save_i(Fl_Button* o, void* v) | |||
{ | |||
char *fn=fl_file_chooser("Save sample", "{*.wav,*.WAV}", NULL); | |||
if (fn && fn!='\0') | |||
{ | |||
strcpy(m_TextBuf,fn); | |||
@@ -535,7 +543,7 @@ void PoshSamplerPluginGUI::cb_Save(Fl_Button* o, void* v) | |||
{ ((PoshSamplerPluginGUI*)(o->parent()))->cb_Save_i(o,v);} | |||
inline void PoshSamplerPluginGUI::cb_Volume_i(Fl_Knob* o, void* v) | |||
{ | |||
{ | |||
m_GUICH->Set("Value",(float)o->value()); | |||
m_GUICH->Set("Num",(int)m_SampleNum->value()); | |||
m_GUICH->SetCommand(PoshSamplerPlugin::SETVOL); | |||
@@ -544,7 +552,7 @@ void PoshSamplerPluginGUI::cb_Volume(Fl_Knob* o, void* v) | |||
{ ((PoshSamplerPluginGUI*)(o->parent()))->cb_Volume_i(o,v);} | |||
inline void PoshSamplerPluginGUI::cb_Pitch_i(Fl_Knob* o, void* v) | |||
{ | |||
{ | |||
m_GUICH->Set("Value",(float)o->value()); | |||
m_GUICH->Set("Num",(int)m_SampleNum->value()); | |||
m_GUICH->SetCommand(PoshSamplerPlugin::SETPITCH); | |||
@@ -553,7 +561,7 @@ void PoshSamplerPluginGUI::cb_Pitch(Fl_Knob* o, void* v) | |||
{ ((PoshSamplerPluginGUI*)(o->parent()))->cb_Pitch_i(o,v);} | |||
inline void PoshSamplerPluginGUI::cb_Octave_i(Fl_Knob* o, void* v) | |||
{ | |||
{ | |||
m_GUICH->Set("Int",(int)o->value()); | |||
m_GUICH->Set("Num",(int)m_SampleNum->value()); | |||
m_GUICH->SetCommand(PoshSamplerPlugin::SETOCT); | |||
@@ -562,7 +570,7 @@ void PoshSamplerPluginGUI::cb_Octave(Fl_Knob* o, void* v) | |||
{ ((PoshSamplerPluginGUI*)(o->parent()))->cb_Octave_i(o,v);} | |||
inline void PoshSamplerPluginGUI::cb_Loop_i(Fl_Button* o, void* v) | |||
{ | |||
{ | |||
m_GUICH->Set("Bool",(bool)o->value()); | |||
m_GUICH->Set("Num",(int)m_SampleNum->value()); | |||
m_GUICH->SetCommand(PoshSamplerPlugin::SETLOOP); | |||
@@ -570,8 +578,17 @@ inline void PoshSamplerPluginGUI::cb_Loop_i(Fl_Button* o, void* v) | |||
void PoshSamplerPluginGUI::cb_Loop(Fl_Button* o, void* v) | |||
{ ((PoshSamplerPluginGUI*)(o->parent()))->cb_Loop_i(o,v);} | |||
inline void PoshSamplerPluginGUI::cb_Retrig_i (Fl_Button *o, void *v) { | |||
m_GUICH->Set("Bool",(bool)o->value()); | |||
m_GUICH->Set("Num",(int)m_SampleNum->value()); | |||
m_GUICH->SetCommand(PoshSamplerPlugin::SETRETRIG); | |||
} | |||
void PoshSamplerPluginGUI::cb_Retrig (Fl_Button *o, void *v) { | |||
((PoshSamplerPluginGUI*)(o->parent()))->cb_Retrig_i (o, v); | |||
} | |||
inline void PoshSamplerPluginGUI::cb_PingPong_i(Fl_Button* o, void* v) | |||
{ | |||
{ | |||
m_GUICH->Set("Bool",(bool)o->value()); | |||
m_GUICH->Set("Num",(int)m_SampleNum->value()); | |||
m_GUICH->SetCommand(PoshSamplerPlugin::SETPING); | |||
@@ -71,95 +71,70 @@ class Fl_WaveDisplay : public Fl_Widget | |||
}; | |||
class PoshSamplerPluginGUI : public SpiralPluginGUI | |||
{ | |||
public: | |||
PoshSamplerPluginGUI(int w, int h, PoshSamplerPlugin *o,ChannelHandler *ch, const HostInfo *Info); | |||
virtual void UpdateValues(SpiralPlugin *o); | |||
virtual void Update(); | |||
void SetPlayPos(long s) { m_Display->SetPlayPos(s); } | |||
int GetCurrentSample() { return (int)m_SampleNum->value(); } | |||
protected: | |||
const std::string GetHelpText(const std::string &loc); | |||
private: | |||
void UpdateSampleDisplay(int num); | |||
char m_TextBuf[256]; | |||
int Numbers[NUM_SAMPLES]; | |||
bool m_UpdateMe; | |||
Fl_Button* m_Load; | |||
Fl_Button* m_Save; | |||
Fl_Button* m_PosMarker; | |||
Fl_Knob* m_Volume; | |||
Fl_Knob* m_Pitch; | |||
Fl_Knob* m_Octave; | |||
Fl_Button* m_Loop; | |||
Fl_Button* m_PingPong; | |||
Fl_Button* m_Record; | |||
Fl_Counter* m_Note; | |||
Fl_WaveDisplay* m_Display; | |||
Fl_Counter* m_SampleNum; | |||
Fl_Button* m_ZoomIn; | |||
Fl_Button* m_ZoomOut; | |||
Fl_Button* m_Cut; | |||
Fl_Button* m_Copy; | |||
Fl_Button* m_Paste; | |||
Fl_Button* m_Mix; | |||
Fl_Button* m_Crop; | |||
Fl_Button* m_Reverse; | |||
Fl_Button* m_Amp; | |||
//// Callbacks //// | |||
inline void cb_Load_i(Fl_Button* o, void* v); | |||
static void cb_Load(Fl_Button* o, void* v); | |||
inline void cb_Save_i(Fl_Button* o, void* v); | |||
static void cb_Save(Fl_Button* o, void* v); | |||
inline void cb_PosMarker_i(Fl_Button* o, void* v); | |||
static void cb_PosMarker(Fl_Button* o, void* v); | |||
inline void cb_Record_i(Fl_Button* o, void* v); | |||
static void cb_Record(Fl_Button* o, void* v); | |||
inline void cb_Volume_i(Fl_Knob* o, void* v); | |||
static void cb_Volume(Fl_Knob* o, void* v); | |||
inline void cb_Pitch_i(Fl_Knob* o, void* v); | |||
static void cb_Pitch(Fl_Knob* o, void* v); | |||
inline void cb_Octave_i(Fl_Knob* o, void* v); | |||
static void cb_Octave(Fl_Knob* o, void* v); | |||
inline void cb_Loop_i(Fl_Button* o, void* v); | |||
static void cb_Loop(Fl_Button* o, void* v); | |||
inline void cb_PingPong_i(Fl_Button* o, void* v); | |||
static void cb_PingPong(Fl_Button* o, void* v); | |||
inline void cb_Note_i(Fl_Counter* o, void* v); | |||
static void cb_Note(Fl_Counter* o, void* v); | |||
inline void cb_SampleNum_i(Fl_Counter* o, void* v); | |||
static void cb_SampleNum(Fl_Counter* o, void* v); | |||
inline void cb_Cut_i(Fl_Button* o, void* v); | |||
static void cb_Cut(Fl_Button* o, void* v); | |||
inline void cb_Copy_i(Fl_Button* o, void* v); | |||
static void cb_Copy(Fl_Button* o, void* v); | |||
inline void cb_Paste_i(Fl_Button* o, void* v); | |||
static void cb_Paste(Fl_Button* o, void* v); | |||
inline void cb_Mix_i(Fl_Button* o, void* v); | |||
static void cb_Mix(Fl_Button* o, void* v); | |||
inline void cb_Crop_i(Fl_Button* o, void* v); | |||
static void cb_Crop(Fl_Button* o, void* v); | |||
inline void cb_Reverse_i(Fl_Button* o, void* v); | |||
static void cb_Reverse(Fl_Button* o, void* v); | |||
inline void cb_Amp_i(Fl_Button* o, void* v); | |||
static void cb_Amp(Fl_Button* o, void* v); | |||
inline void cb_ZoomIn_i(Fl_Button* o, void* v); | |||
static void cb_ZoomIn(Fl_Button* o, void* v); | |||
inline void cb_ZoomOut_i(Fl_Button* o, void* v); | |||
static void cb_ZoomOut(Fl_Button* o, void* v); | |||
inline void cb_WaveDisplay_i(Fl_WaveDisplay* o, void* v); | |||
static void cb_WaveDisplay(Fl_WaveDisplay* o, void* v); | |||
class PoshSamplerPluginGUI : public SpiralPluginGUI { | |||
public: | |||
PoshSamplerPluginGUI (int w, int h, PoshSamplerPlugin *o, ChannelHandler *ch, const HostInfo *Info); | |||
virtual void UpdateValues (SpiralPlugin *o); | |||
virtual void Update(); | |||
void SetPlayPos (long s) { m_Display->SetPlayPos(s); } | |||
int GetCurrentSample() { return (int)m_SampleNum->value(); } | |||
protected: | |||
const std::string GetHelpText(const std::string &loc); | |||
private: | |||
void UpdateSampleDisplay(int num); | |||
char m_TextBuf[256]; | |||
int Numbers[NUM_SAMPLES]; | |||
bool m_UpdateMe; | |||
Fl_Knob *m_Volume, *m_Pitch, *m_Octave; | |||
Fl_Button *m_Load, *m_Save, *m_Record, *m_Loop, *m_PingPong, *m_PosMarker, *m_Retrig; | |||
Fl_Button *m_ZoomIn, *m_ZoomOut, *m_Cut, *m_Copy, *m_Paste, *m_Mix, *m_Crop, *m_Reverse, *m_Amp; | |||
Fl_Counter *m_Note, *m_SampleNum; | |||
Fl_WaveDisplay *m_Display; | |||
//// Callbacks //// | |||
inline void cb_Load_i (Fl_Button *o, void *v); | |||
static void cb_Load (Fl_Button *o, void *v); | |||
inline void cb_Save_i (Fl_Button *o, void *v); | |||
static void cb_Save (Fl_Button *o, void *v); | |||
inline void cb_Record_i (Fl_Button *o, void *v); | |||
static void cb_Record (Fl_Button *o, void *v); | |||
inline void cb_Loop_i (Fl_Button *o, void *v); | |||
static void cb_Loop (Fl_Button *o, void *v); | |||
inline void cb_PingPong_i (Fl_Button *o, void *v); | |||
static void cb_PingPong (Fl_Button *o, void *v); | |||
inline void cb_PosMarker_i (Fl_Button *o, void *v); | |||
static void cb_PosMarker (Fl_Button *o, void *v); | |||
inline void cb_Retrig_i (Fl_Button *o, void *v); | |||
static void cb_Retrig (Fl_Button *o, void *v); | |||
inline void cb_Volume_i (Fl_Knob *o, void *v); | |||
static void cb_Volume (Fl_Knob *o, void *v); | |||
inline void cb_Pitch_i (Fl_Knob *o, void *v); | |||
static void cb_Pitch (Fl_Knob *o, void *v); | |||
inline void cb_Octave_i (Fl_Knob *o, void *v); | |||
static void cb_Octave (Fl_Knob *o, void *v); | |||
inline void cb_Note_i (Fl_Counter *o, void *v); | |||
static void cb_Note (Fl_Counter *o, void *v); | |||
inline void cb_SampleNum_i (Fl_Counter *o, void *v); | |||
static void cb_SampleNum (Fl_Counter *o, void *v); | |||
inline void cb_Cut_i (Fl_Button *o, void *v); | |||
static void cb_Cut (Fl_Button *o, void *v); | |||
inline void cb_Copy_i (Fl_Button *o, void *v); | |||
static void cb_Copy (Fl_Button *o, void *v); | |||
inline void cb_Paste_i (Fl_Button *o, void *v); | |||
static void cb_Paste (Fl_Button *o, void *v); | |||
inline void cb_Mix_i (Fl_Button *o, void *v); | |||
static void cb_Mix (Fl_Button *o, void *v); | |||
inline void cb_Crop_i (Fl_Button *o, void *v); | |||
static void cb_Crop (Fl_Button *o, void *v); | |||
inline void cb_Reverse_i (Fl_Button *o, void *v); | |||
static void cb_Reverse (Fl_Button *o, void *v); | |||
inline void cb_Amp_i (Fl_Button *o, void *v); | |||
static void cb_Amp (Fl_Button *o, void *v); | |||
inline void cb_ZoomIn_i (Fl_Button *o, void *v); | |||
static void cb_ZoomIn (Fl_Button *o, void *v); | |||
inline void cb_ZoomOut_i (Fl_Button *o, void *v); | |||
static void cb_ZoomOut (Fl_Button *o, void *v); | |||
inline void cb_WaveDisplay_i (Fl_WaveDisplay *o, void *v); | |||
static void cb_WaveDisplay (Fl_WaveDisplay *o, void *v); | |||
}; | |||
#endif |