diff --git a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.C b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.C index c65952d..4f12c5f 100644 --- a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.C +++ b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.C @@ -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; nRegister("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::iterator i=m_SampleVec.begin(); - i!=m_SampleVec.end(); i++) - { - delete(*i); - } - - for (vector::iterator i=m_SampleDescVec.begin(); - i!=m_SampleDescVec.end(); i++) - { - delete(*i); - } +PoshSamplerPlugin::~PoshSamplerPlugin() { + for (vector::iterator i=m_SampleVec.begin(); i!=m_SampleVec.end(); i++) + delete(*i); + for (vector::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; sPitch = 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; sPitch = 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; sZero(); - } - - float Freq=0; - - for (int n=0; nBUFSIZE; n++) - { - Freq=GetInputPitch(NOTETRIG,n); - - for (int s=0; sGetLength()) - { - // 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; sZero(); + float Freq = 0; + for (int n=0; nBUFSIZE; n++) { + Freq = GetInputPitch (NOTETRIG, n); + for (int s=0; sGetLength()) { + // 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<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; nVolume << " " << + 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>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> 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) diff --git a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.h b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.h index 736e821..bc4b76f 100644 --- a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.h +++ b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.h @@ -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 +*/ #ifndef PoshSamplerPLUGIN #define PoshSamplerPLUGIN +#include "../SpiralPlugin.h" +#include + 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 m_SampleVec; - std::vector 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 m_SampleVec; + std::vector 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 diff --git a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.C b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.C index fc8f639..d769ca8 100644 --- a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.C +++ b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.C @@ -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); diff --git a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.h b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.h index 6fad88b..cb1828f 100644 --- a/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.h +++ b/SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPluginGUI.h @@ -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