@@ -50,38 +50,35 @@ string GetGroupName() | |||
/////////////////////////////////////////////////////// | |||
StreamPlugin::StreamPlugin() : | |||
m_SampleSize(256), | |||
m_Pos(0), | |||
m_StreamPos(0), | |||
m_GlobalPos(0), | |||
m_SampleRate (44100), | |||
m_SampleSize (256), | |||
m_StreamPos (0), | |||
m_GlobalPos (0), | |||
m_Pitch (1.0f), | |||
m_SamplePos (-1), | |||
m_Pos (0), | |||
m_Mode(STOPM) | |||
{ | |||
m_PluginInfo.Name="Stream"; | |||
m_PluginInfo.Width=245; | |||
m_PluginInfo.Height=165; | |||
m_PluginInfo.NumInputs=1; | |||
m_PluginInfo.NumOutputs=2; | |||
m_PluginInfo.PortTips.push_back("Pitch CV"); | |||
m_PluginInfo.PortTips.push_back("Left Out"); | |||
m_PluginInfo.PortTips.push_back("Right Out"); | |||
m_StreamDesc.Volume = 1.0f; | |||
m_StreamDesc.Pitch = 1.0f; | |||
m_StreamDesc.PitchMod = 1.0f; | |||
m_StreamDesc.SamplePos = -1; | |||
m_StreamDesc.Loop = false; | |||
m_StreamDesc.Note = 0; | |||
m_StreamDesc.Pathname = "None"; | |||
m_StreamDesc.TriggerUp = true; | |||
m_StreamDesc.SampleRate = 44100; | |||
m_StreamDesc.Stereo = false; | |||
m_AudioCH->Register("Volume",&m_StreamDesc.Volume); | |||
m_AudioCH->Register("Pitch",&m_StreamDesc.PitchMod,ChannelHandler::INPUT); | |||
m_AudioCH->RegisterData("FileName",ChannelHandler::INPUT,&m_FileNameArg,sizeof(m_FileNameArg)); | |||
m_AudioCH->Register("Time",&m_TimeArg); | |||
m_AudioCH->Register("TimeOut",&m_TimeOut,ChannelHandler::OUTPUT); | |||
m_AudioCH->Register("MaxTime",&m_MaxTime,ChannelHandler::OUTPUT); | |||
m_PluginInfo.Name = "Stream"; | |||
m_PluginInfo.Width = 245; | |||
m_PluginInfo.Height = 165; | |||
m_PluginInfo.NumInputs = 3; | |||
m_PluginInfo.NumOutputs = 3; | |||
m_PluginInfo.PortTips.push_back ("Pitch CV"); | |||
m_PluginInfo.PortTips.push_back ("Play Trigger"); | |||
m_PluginInfo.PortTips.push_back ("Stop Trigger"); | |||
m_PluginInfo.PortTips.push_back ("Left Out"); | |||
m_PluginInfo.PortTips.push_back ("Right Out"); | |||
m_PluginInfo.PortTips.push_back ("Finish Trigger"); | |||
m_GUIArgs.Volume = 1.0f; | |||
m_GUIArgs.PitchMod = 1.0f; | |||
m_AudioCH->Register ("Volume", &m_GUIArgs.Volume); | |||
m_AudioCH->Register ("Pitch", &m_GUIArgs.PitchMod, ChannelHandler::INPUT); | |||
m_AudioCH->RegisterData ("FileName", ChannelHandler::INPUT, | |||
&m_GUIArgs.FileName, sizeof (m_GUIArgs.FileName)); | |||
m_AudioCH->Register ("Time", &m_GUIArgs.Time); | |||
m_AudioCH->Register ("TimeOut", &m_GUIArgs.TimeOut, ChannelHandler::OUTPUT); | |||
m_AudioCH->Register ("MaxTime", &m_GUIArgs.MaxTime, ChannelHandler::OUTPUT); | |||
} | |||
StreamPlugin::~StreamPlugin() | |||
@@ -89,172 +86,125 @@ StreamPlugin::~StreamPlugin() | |||
} | |||
PluginInfo &StreamPlugin::Initialise(const HostInfo *Host) | |||
{ | |||
{ | |||
PluginInfo& Info = SpiralPlugin::Initialise(Host); | |||
return Info; | |||
} | |||
SpiralGUIType *StreamPlugin::CreateGUI() | |||
{ | |||
return new StreamPluginGUI(m_PluginInfo.Width, | |||
m_PluginInfo.Height, | |||
this,m_AudioCH,m_HostInfo); | |||
} | |||
void StreamPlugin::Execute() | |||
{ | |||
float CVPitch=0; | |||
if (m_File.IsOpen()) | |||
{ | |||
for (int n=0; n<m_HostInfo->BUFSIZE; n++) | |||
{ | |||
CVPitch=GetInput(0,n)*10.0f; | |||
if (m_Pos<0) | |||
{ | |||
m_Pos=m_SampleSize-1; | |||
m_StreamPos-=m_SampleSize; | |||
if (m_StreamPos<0) | |||
{ | |||
m_StreamPos=m_File.GetSize()/2-m_SampleSize; | |||
m_GlobalPos=m_StreamPos; | |||
} | |||
m_File.SeekToChunk(m_StreamPos); | |||
m_File.LoadChunk(m_SampleSize, m_SampleL, m_SampleR); | |||
} | |||
else | |||
{ | |||
if (m_Pos>=m_SampleSize) | |||
{ | |||
//m_SampleSize=(int)(BUFSECONDS*m_HostInfo->SAMPLERATE*m_StreamDesc.PitchMod); | |||
m_Pos=0; | |||
m_StreamPos+=m_SampleSize; | |||
if (m_StreamPos>=m_File.GetSize()/2) | |||
{ | |||
m_StreamPos=0; | |||
m_GlobalPos=0; | |||
} | |||
m_File.SeekToChunk(m_StreamPos); | |||
m_File.LoadChunk(m_SampleSize, m_SampleL, m_SampleR); | |||
} | |||
} | |||
SetOutput(0,n,m_SampleL[m_Pos]*m_StreamDesc.Volume); | |||
SetOutput(1,n,m_SampleR[m_Pos]*m_StreamDesc.Volume); | |||
m_Pos+=m_StreamDesc.PitchMod+CVPitch; | |||
m_GlobalPos+=m_StreamDesc.PitchMod+CVPitch; | |||
} | |||
m_TimeOut=GetTime(); | |||
SpiralGUIType *StreamPlugin::CreateGUI() { | |||
return new StreamPluginGUI(m_PluginInfo.Width, m_PluginInfo.Height, this, m_AudioCH, m_HostInfo); | |||
} | |||
void StreamPlugin::Execute() { | |||
if (m_File.IsOpen()) { | |||
for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | |||
bool FinTrig = false; | |||
float CVPitch = GetInput(0, n)*10.0f; | |||
if (GetInput (1, n) > 0) Play(); | |||
if (GetInput (2, n) > 0) Stop(); | |||
if (m_Pos<0) { | |||
m_Pos = m_SampleSize - 1; | |||
m_StreamPos -= m_SampleSize; | |||
FinTrig = m_StreamPos < 0; | |||
if (FinTrig) { | |||
m_StreamPos = m_File.GetSize() - m_SampleSize; | |||
m_GlobalPos = m_StreamPos; | |||
} | |||
m_File.SeekToChunk (m_StreamPos); | |||
m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | |||
} | |||
else if (m_Pos >= m_SampleSize) { | |||
m_Pos = 0; | |||
m_StreamPos += m_SampleSize; | |||
FinTrig = m_StreamPos >= m_File.GetSize(); | |||
if (FinTrig) { | |||
m_StreamPos = 0; | |||
m_GlobalPos = 0; | |||
} | |||
m_File.SeekToChunk (m_StreamPos); | |||
m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | |||
} | |||
SetOutput (0, n, m_SampleL[m_Pos] * m_GUIArgs.Volume); | |||
SetOutput (1, n, m_SampleR[m_Pos] * m_GUIArgs.Volume); | |||
if (FinTrig) SetOutput (2, n, 1); else SetOutput (2, n, 0); | |||
if (m_Mode==PLAYM) { | |||
m_Pos += m_GUIArgs.PitchMod + CVPitch; | |||
m_GlobalPos += m_GUIArgs.PitchMod + CVPitch; | |||
} | |||
} | |||
m_GUIArgs.TimeOut = GetTime(); | |||
} | |||
} | |||
void StreamPlugin::ExecuteCommands() { | |||
if (m_AudioCH->IsCommandWaiting()) { | |||
switch (m_AudioCH->GetCommand()) { | |||
case SET_TIME: SetTime(); break; | |||
case LOAD: OpenStream(); break; | |||
case RESTART: Restart(); break; | |||
case STOP: Stop(); break; | |||
case PLAY: Play(); break; | |||
} | |||
} | |||
} | |||
void StreamPlugin::ExecuteCommands() | |||
{ | |||
if (m_AudioCH->IsCommandWaiting()) | |||
{ | |||
switch(m_AudioCH->GetCommand()) | |||
{ | |||
case (LOAD) : OpenStream(m_FileNameArg); break; | |||
case (RESTART) : Restart(); break; | |||
case (STOP) : Stop(); break; | |||
case (PLAY) : Play(); break; | |||
case (NUDGE) : Nudge(); break; | |||
case (SET_TIME) : SetTime(m_TimeArg); break; | |||
} | |||
} | |||
void StreamPlugin::SetTime (void) { | |||
m_GlobalPos = m_SampleRate * m_GUIArgs.Time; | |||
m_StreamPos = (int)(m_SampleRate * m_GUIArgs.Time); | |||
m_Pos = m_SampleSize; | |||
} | |||
void StreamPlugin::StreamOut(ostream &s) | |||
{ | |||
s<<m_Version<<" "; | |||
s<<m_StreamDesc.Volume<<" "<< | |||
m_StreamDesc.PitchMod<<" "<< | |||
m_StreamDesc.Pathname.size()<<" "<< | |||
m_StreamDesc.Pathname<<" "; | |||
s<<m_Pos<<" "; | |||
s<<m_StreamPos<<" "; | |||
s<<m_GlobalPos<<" "; | |||
s<<m_Pitch<<" "<<endl; | |||
void StreamPlugin::OpenStream (void) { | |||
m_StreamPos = 0; | |||
m_GlobalPos = 0; | |||
if (m_File.IsOpen ()) m_File.Close (); | |||
m_File.Open (m_GUIArgs.FileName, WavFile::READ); | |||
m_SampleL.Allocate (m_SampleSize); | |||
m_SampleR.Allocate (m_SampleSize); | |||
m_Pitch = m_SampleRate / (float)m_HostInfo->SAMPLERATE; | |||
if (m_File.IsStereo ()) { | |||
m_Pitch *= 2; | |||
m_GUIArgs.MaxTime = GetLength(); | |||
} | |||
else m_GUIArgs.MaxTime = GetLength() / 2; | |||
} | |||
void StreamPlugin::StreamIn(istream &s) | |||
{ | |||
int version; | |||
s>>version; | |||
s>>m_StreamDesc.Volume>> | |||
m_StreamDesc.PitchMod; | |||
char Buf[4096]; | |||
int size; | |||
s>>size; | |||
s.ignore(1); | |||
s.get(Buf,size+1); | |||
m_StreamDesc.Pathname=Buf; | |||
if (m_StreamDesc.Pathname!="None") | |||
OpenStream(m_StreamDesc.Pathname); | |||
s>>m_Pos; | |||
s>>m_StreamPos; | |||
s>>m_GlobalPos; | |||
s>>m_Pitch; | |||
float StreamPlugin::GetLength (void) { | |||
if (m_File.IsStereo()) return m_File.GetSize() / (float)m_File.GetSamplerate (); | |||
else return m_File.GetSize() / (float)m_File.GetSamplerate () * 2; | |||
} | |||
void StreamPlugin::OpenStream(const string &Name) | |||
{ | |||
m_StreamPos=0; | |||
m_GlobalPos=0; | |||
if (m_File.IsOpen()) m_File.Close(); | |||
m_File.Open(Name,WavFile::READ); | |||
m_SampleL.Allocate(m_SampleSize); | |||
m_SampleR.Allocate(m_SampleSize); | |||
m_StreamDesc.Pathname=Name; | |||
m_StreamDesc.SampleRate=m_File.GetSamplerate(); | |||
m_StreamDesc.Stereo=m_File.IsStereo(); | |||
m_StreamDesc.Pitch = m_StreamDesc.SampleRate/(float)m_HostInfo->SAMPLERATE; | |||
if (m_StreamDesc.Stereo) | |||
{ | |||
m_StreamDesc.Pitch*=2; | |||
m_MaxTime=GetLength(); | |||
} | |||
else m_MaxTime=GetLength()/2; | |||
void StreamPlugin::StreamOut (ostream &s) { | |||
s << m_Version << " " | |||
<< m_GUIArgs.Volume << " " | |||
<< m_GUIArgs.PitchMod << " " | |||
<< strlen (m_GUIArgs.FileName) << " " | |||
<< m_GUIArgs.FileName << " " | |||
// is it really necessary to save this lot?? | |||
<< m_Pos << " " | |||
<< m_StreamPos << " " | |||
<< m_GlobalPos << " " | |||
<< m_Pitch << " " << endl; | |||
} | |||
void StreamPlugin::Restart() | |||
{ | |||
m_StreamPos=0; m_GlobalPos=0; | |||
} | |||
void StreamPlugin::Play() | |||
{ | |||
if (m_Mode==PLAYM) return; | |||
m_StreamDesc.PitchMod=m_Pitch; | |||
m_Mode=PLAYM; | |||
} | |||
void StreamPlugin::StreamIn(istream &s) { | |||
int version; | |||
s >> version; | |||
void StreamPlugin::Stop() | |||
{ | |||
if (m_Mode==STOPM) return; | |||
m_Pitch=m_StreamDesc.PitchMod; | |||
m_StreamDesc.PitchMod=0.0f; | |||
m_Mode=STOPM; | |||
s >> m_GUIArgs.Volume >> m_GUIArgs.PitchMod; | |||
int size; | |||
s >> size; | |||
if (size > 255) size = 255; | |||
s.ignore (1); | |||
s.get (m_GUIArgs.FileName, size+1); | |||
if (m_GUIArgs.FileName != "None") OpenStream (); | |||
// is it really necessary to load this lot?? | |||
s >> m_Pos; | |||
s >> m_StreamPos; | |||
s >> m_GlobalPos; | |||
s >> m_Pitch; | |||
} | |||
float StreamPlugin::GetLength() | |||
{ | |||
if (m_StreamDesc.Stereo) return (m_File.GetSize()/(float)m_StreamDesc.SampleRate)*0.5f; | |||
else return m_File.GetSize()/(float)m_StreamDesc.SampleRate; | |||
} | |||
void StreamPlugin::SetTime(float t) | |||
{ | |||
m_GlobalPos=m_StreamDesc.SampleRate*t; | |||
m_StreamPos=(int)(m_StreamDesc.SampleRate*t); | |||
m_Pos=m_SampleSize; | |||
} | |||
@@ -14,7 +14,7 @@ | |||
* 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 "../../RiffWav.h" | |||
@@ -23,76 +23,46 @@ | |||
#ifndef StreamPLUGIN | |||
#define StreamPLUGIN | |||
static const int NUDGESIZE=44100/4; | |||
struct SampleDesc | |||
{ | |||
string Pathname; | |||
class StreamPlugin : public SpiralPlugin { | |||
public: | |||
StreamPlugin(); | |||
virtual ~StreamPlugin(); | |||
virtual PluginInfo &Initialise (const HostInfo *Host); | |||
virtual SpiralGUIType *CreateGUI(); | |||
virtual void Execute(); | |||
virtual void ExecuteCommands(); | |||
virtual void StreamOut (ostream &s); | |||
virtual void StreamIn (istream &s); | |||
enum GUICommands { NONE, SET_TIME, LOAD, RESTART, STOP, PLAY }; | |||
// has to be defined in the plugin | |||
virtual void UpdateGUI() { Fl::check(); } | |||
float GetVolume (void) { return m_GUIArgs.Volume; } | |||
float GetPitch (void) { return m_GUIArgs.PitchMod; } | |||
private: | |||
struct GUIArgs { | |||
float Volume; | |||
float Pitch; | |||
float PitchMod; | |||
bool Loop; | |||
int Note; | |||
bool TriggerUp; | |||
float SamplePos; | |||
int SampleRate; | |||
bool Stereo; | |||
}; | |||
class StreamPlugin : public SpiralPlugin | |||
{ | |||
public: | |||
enum Mode{PLAYM,STOPM}; | |||
enum GUICommands{NONE,LOAD,RESTART,STOP,PLAY,HALF,RESET,DOUBLE,NUDGE,SET_TIME}; | |||
StreamPlugin(); | |||
virtual ~StreamPlugin(); | |||
virtual PluginInfo &Initialise(const HostInfo *Host); | |||
virtual SpiralGUIType *CreateGUI(); | |||
virtual void Execute(); | |||
virtual void ExecuteCommands(); | |||
virtual void StreamOut(ostream &s); | |||
virtual void StreamIn(istream &s); | |||
// has to be defined in the plugin | |||
virtual void UpdateGUI() { Fl::check(); } | |||
void OpenStream(const string &Name); | |||
void SetVolume(float s) { m_StreamDesc.Volume=s; } | |||
float GetVolume() { return m_StreamDesc.Volume; } | |||
void SetPitch(float s) { m_StreamDesc.PitchMod=s; } | |||
float GetPitch() { return m_StreamDesc.PitchMod; } | |||
void SetLoop(bool s) { m_StreamDesc.Loop=s; } | |||
bool GetLoop() { return m_StreamDesc.Loop; } | |||
float GetLength(); | |||
float GetTime() { return m_GlobalPos/(float)m_StreamDesc.SampleRate; } | |||
void SetTime(float t); | |||
void Nudge() { m_Pos-=NUDGESIZE; } | |||
void Restart(); | |||
void Play(); | |||
void Stop(); | |||
private: | |||
WavFile m_File; | |||
Sample m_SampleL; | |||
Sample m_SampleR; | |||
SampleDesc m_StreamDesc; | |||
int m_SampleSize; | |||
float m_Pos; | |||
int m_StreamPos; | |||
float m_GlobalPos; | |||
float m_Pitch; | |||
Mode m_Mode; | |||
char m_FileNameArg[256]; | |||
float m_TimeArg; | |||
float m_TimeOut; | |||
float m_MaxTime; | |||
char FileName[256]; | |||
float Time; | |||
float TimeOut; | |||
float MaxTime; | |||
}; | |||
GUIArgs m_GUIArgs; | |||
WavFile m_File; | |||
Sample m_SampleL, m_SampleR; | |||
int m_SampleRate, m_SampleSize, m_StreamPos; | |||
float m_GlobalPos, m_Pitch, m_SamplePos, m_Pos; | |||
enum Mode { PLAYM, STOPM }; | |||
Mode m_Mode; | |||
// Internal functions | |||
float GetTime (void) { return m_GlobalPos / (float)m_SampleRate; } | |||
float GetLength (void); | |||
// Commands | |||
void SetTime (void); | |||
void OpenStream (void); | |||
void Restart (void) { m_StreamPos = 0; m_GlobalPos = 0; } | |||
void Stop (void) { m_Mode = STOPM; } | |||
void Play (void) { m_Mode = PLAYM; } | |||
}; | |||
#endif |
@@ -14,7 +14,7 @@ | |||
* 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 "StreamPluginGUI.h" | |||
#include <FL/fl_draw.h> | |||
@@ -24,86 +24,17 @@ | |||
static const int GUI_COLOUR = 179; | |||
static const int GUIBG_COLOUR = 144; | |||
static const int GUIBG2_COLOUR = 145; | |||
char PitchLabel[256]; | |||
char PitchLabel[256]; | |||
//////////////////////////////////////////// | |||
StreamPluginGUI::StreamPluginGUI(int w, int h,StreamPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
SpiralPluginGUI(w,h,o,ch) | |||
{ | |||
m_PitchValue=1.0f; | |||
m_TempPitch=1.0f; | |||
m_Load = new Fl_Button(2, 130, 30, 30, "Load"); | |||
m_Load->labelsize(9); | |||
m_Load->callback((Fl_Callback*)cb_Load); | |||
add(m_Load); | |||
int sx=32; | |||
m_ToStart = new Fl_Button(sx, 130, 30, 30, "@|<"); | |||
m_ToStart->labelsize(10); | |||
m_ToStart->labeltype(FL_SYMBOL_LABEL); | |||
m_ToStart->callback((Fl_Callback*)cb_ToStart); | |||
add(m_ToStart); | |||
m_Stop = new Fl_Button(sx+30, 130, 30, 30, "@||"); | |||
m_Stop->labelsize(10); | |||
m_Stop->labeltype(FL_SYMBOL_LABEL); | |||
m_Stop->callback((Fl_Callback*)cb_Stop); | |||
add(m_Stop); | |||
m_Play = new Fl_Button(sx+60, 130, 30, 30, "@>"); | |||
m_Play->labelsize(10); | |||
m_Play->labeltype(FL_SYMBOL_LABEL); | |||
m_Play->callback((Fl_Callback*)cb_Play); | |||
add(m_Play); | |||
m_Div = new Fl_Button(sx+90, 130, 30, 30, "/2"); | |||
m_Div->labelsize(9); | |||
m_Div->callback((Fl_Callback*)cb_Div); | |||
add(m_Div); | |||
m_Reset = new Fl_Button(sx+120, 130, 30, 30, "Reset"); | |||
m_Reset->labelsize(9); | |||
m_Reset->callback((Fl_Callback*)cb_Reset); | |||
add(m_Reset); | |||
m_Loop = new Fl_Button(sx+150, 130, 30, 30, "X2"); | |||
m_Loop->labelsize(9); | |||
m_Loop->callback((Fl_Callback*)cb_Loop); | |||
add(m_Loop); | |||
m_Nudge = new Fl_Repeat_Button(sx+180, 130, 30, 30, "Nudge"); | |||
m_Nudge->labelsize(9); | |||
m_Nudge->callback((Fl_Callback*)cb_Nudge); | |||
add(m_Nudge); | |||
m_Volume = new Fl_Knob (180, 15, 50, 50, "Volume"); | |||
m_Volume->color(GUI_COLOUR); | |||
m_Volume->type(Fl_Knob::LINELIN); | |||
m_Volume->labelsize(10); | |||
m_Volume->maximum(2); | |||
m_Volume->step(0.001); | |||
m_Volume->value(1); | |||
m_Volume->callback((Fl_Callback*)cb_Volume); | |||
add(m_Volume); | |||
m_Pitch = new Fl_Slider(5,85,235,20, ""); | |||
m_Pitch->type(FL_HORIZONTAL); | |||
m_Pitch->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT); | |||
m_Pitch->labelsize(10); | |||
m_Pitch->labelcolor(GUI_COLOUR); | |||
m_Pitch->maximum(20); | |||
m_Pitch->step(0.001); | |||
sprintf(PitchLabel,"%1.3f ",1.0); | |||
m_Pitch->label(PitchLabel); | |||
m_Pitch->value(11); | |||
m_Pitch->callback((Fl_Callback*)cb_Pitch); | |||
add(m_Pitch); | |||
for (int dis=0; dis<6; dis++) { | |||
SpiralPluginGUI(w,h,o,ch), | |||
m_PitchValue (1.0f) | |||
{ | |||
// 7 seg displays | |||
for (int dis=0; dis<6; dis++) { | |||
m_Display[dis] = new Fl_SevenSeg (5 + 28*dis, 20, 28, 60); | |||
m_Display[dis] -> bar_width (4); | |||
m_Display[dis] -> color (FL_WHITE); | |||
@@ -111,160 +42,252 @@ SpiralPluginGUI(w,h,o,ch) | |||
if (dis > 0 && dis % 2 == 0) m_Display[dis] -> dp (colon); | |||
add (m_Display[dis]); | |||
} | |||
// volume control | |||
m_Volume = new Fl_Knob (180, 15, 50, 50, "Volume"); | |||
m_Volume->color (GUI_COLOUR); | |||
m_Volume->type (Fl_Knob::LINELIN); | |||
m_Volume->labelsize (10); | |||
m_Volume->maximum (2); | |||
m_Volume->step (0.001); | |||
m_Volume->value (1); | |||
m_Volume->callback ((Fl_Callback*)cb_Volume); | |||
add (m_Volume); | |||
// pitch indicator | |||
m_Pitch = new Fl_Slider (5, 85, 235, 20, ""); | |||
m_Pitch->type (FL_HORIZONTAL); | |||
m_Pitch->align (FL_ALIGN_INSIDE | FL_ALIGN_RIGHT); | |||
m_Pitch->labelsize (10); | |||
m_Pitch->labelcolor (GUI_COLOUR); | |||
m_Pitch->maximum (20); | |||
m_Pitch->step (0.001); | |||
UpdatePitch (true, false, false); | |||
m_Pitch->callback ((Fl_Callback*)cb_Pitch); | |||
add (m_Pitch); | |||
// position indicator | |||
m_Pos = new Fl_Slider (5, 108, 235, 20, ""); | |||
m_Pos->type (FL_HORIZONTAL); | |||
m_Pos->maximum (1); | |||
m_Pos->callback ((Fl_Callback*)cb_Pos); | |||
add (m_Pos); | |||
// load btn | |||
m_Load = new Fl_Button (2, 130, 30, 30, "Load"); | |||
m_Load->labelsize (9); | |||
m_Load->callback ((Fl_Callback*)cb_Load); | |||
add (m_Load); | |||
// reset btn | |||
m_ToStart = new Fl_Button (32, 130, 30, 30, "@|<"); | |||
m_ToStart->labelsize (10); | |||
m_ToStart->labeltype (FL_SYMBOL_LABEL); | |||
m_ToStart->callback ((Fl_Callback*)cb_ToStart); | |||
add (m_ToStart); | |||
// stop btn | |||
m_Stop = new Fl_Button (62, 130, 30, 30, "@||"); | |||
m_Stop->labelsize (10); | |||
m_Stop->labeltype (FL_SYMBOL_LABEL); | |||
m_Stop->callback ((Fl_Callback*)cb_Stop); | |||
add (m_Stop); | |||
// play btn | |||
m_Play = new Fl_Button (92, 130, 30, 30, "@>"); | |||
m_Play->labelsize (10); | |||
m_Play->labeltype (FL_SYMBOL_LABEL); | |||
m_Play->callback ((Fl_Callback*)cb_Play); | |||
add (m_Play); | |||
// 1/2 speed btn | |||
m_Div = new Fl_Button (122, 130, 30, 30, "/2"); | |||
m_Div->labelsize (9); | |||
m_Div->callback ((Fl_Callback*)cb_Div); | |||
add (m_Div); | |||
// normal speed btn | |||
m_Reset = new Fl_Button (152, 130, 30, 30, "Reset"); | |||
m_Reset->labelsize (9); | |||
m_Reset->callback ((Fl_Callback*)cb_Reset); | |||
add (m_Reset); | |||
// dbl speed btn | |||
m_Dbl = new Fl_Button (182, 130, 30, 30, "X2"); | |||
m_Dbl->labelsize (9); | |||
m_Dbl->callback ((Fl_Callback*)cb_Dbl); | |||
add (m_Dbl); | |||
// nudge btn | |||
m_Nudge = new Fl_Repeat_Button (212, 130, 30, 30, "Nudge"); | |||
m_Nudge->labelsize (9); | |||
m_Nudge->callback ((Fl_Callback*)cb_Nudge); | |||
add (m_Nudge); | |||
} | |||
StreamPluginGUI::~StreamPluginGUI () { | |||
} | |||
m_Pos = new Fl_Slider(5,108,235,20,""); | |||
m_Pos->type(FL_HORIZONTAL); | |||
m_Pos->maximum(1); | |||
m_Pos->callback((Fl_Callback*)cb_Pos); | |||
add(m_Pos); | |||
// Update signalled from plugin | |||
end(); | |||
void StreamPluginGUI::Update() { | |||
float t=m_GUICH->GetFloat ("TimeOut"); | |||
m_Pos->value (t); | |||
m_Display[5]->value ((int)(t*100) % 10); | |||
m_Display[4]->value ((int)(t*10) % 10); | |||
m_Display[3]->value ((int)t % 10); | |||
m_Display[2]->value ((int)(t/10) % 6); | |||
m_Display[1]->value ((int)(t/60) % 10); | |||
m_Display[0]->value ((int)(t/600) % 10); | |||
redraw(); | |||
SetMaxTime (m_GUICH->GetFloat ("MaxTime")); | |||
} | |||
StreamPluginGUI::~StreamPluginGUI() | |||
{ | |||
// Update GUI on load | |||
void StreamPluginGUI::UpdateValues (SpiralPlugin *o) { | |||
StreamPlugin *Plugin = (StreamPlugin*)o; | |||
m_Volume->value (Plugin->GetVolume()); | |||
m_Pitch->value (Plugin->GetPitch()+10); | |||
} | |||
void StreamPluginGUI::Update() | |||
{ | |||
float t=m_GUICH->GetFloat("TimeOut"); | |||
// volume | |||
m_Pos->value(t); | |||
inline void StreamPluginGUI::cb_Volume_i (Fl_Knob* o, void* v) { | |||
m_GUICH->Set ("Volume", (float)o->value ()); | |||
} | |||
m_Display[5]->value((int)(t*100)%10); | |||
m_Display[4]->value((int)(t*10)%10); | |||
void StreamPluginGUI::cb_Volume (Fl_Knob* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Volume_i (o, v); | |||
} | |||
m_Display[3]->value((int)t%10); | |||
m_Display[2]->value((int)(t/10)%6); | |||
// pitch | |||
m_Display[1]->value((int)(t/60)%10); | |||
m_Display[0]->value((int)(t/600)%10); | |||
redraw(); | |||
void StreamPluginGUI::UpdatePitch (bool UpdateIt = true, bool DrawIt = true, bool SendIt = true) { | |||
sprintf( PitchLabel, "%1.3f ", m_PitchValue); | |||
m_Pitch->label (PitchLabel); | |||
if (UpdateIt) m_Pitch->value (m_PitchValue+10); | |||
if (DrawIt) redraw(); | |||
if (SendIt) m_GUICH->Set ("Pitch", m_PitchValue); | |||
} | |||
SetMaxTime(m_GUICH->GetFloat("MaxTime")); | |||
inline void StreamPluginGUI::cb_Pitch_i (Fl_Slider* o, void* v) { | |||
m_PitchValue=o->value()-10; | |||
UpdatePitch (false, false); | |||
} | |||
void StreamPluginGUI::cb_Pitch (Fl_Slider* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Pitch_i(o,v); | |||
} | |||
void StreamPluginGUI::UpdateValues(SpiralPlugin *o) | |||
{ | |||
StreamPlugin *Plugin = (StreamPlugin*)o; | |||
// position | |||
inline void StreamPluginGUI::cb_Pos_i (Fl_Slider* o, void* v) { | |||
m_GUICH->Set ("Time",(float)o->value()); | |||
m_GUICH->SetCommand (StreamPlugin::SET_TIME); | |||
} | |||
m_Volume->value(Plugin->GetVolume()); | |||
m_Pitch->value(Plugin->GetPitch()+10); | |||
m_Loop->value(Plugin->GetLoop()); | |||
void StreamPluginGUI::cb_Pos (Fl_Slider* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Pos_i (o, v); | |||
} | |||
inline void StreamPluginGUI::cb_Load_i(Fl_Button* o, void* v) | |||
{ | |||
char *fn=fl_file_chooser("Load a sample", "{*.wav,*.WAV}", NULL); | |||
if (fn && fn!='\0') | |||
{ | |||
strcpy(m_TextBuf,fn); | |||
m_GUICH->SetData("FileName",(void*)m_TextBuf); | |||
m_GUICH->SetCommand(StreamPlugin::LOAD); | |||
m_GUICH->Wait(); | |||
SetMaxTime(m_GUICH->GetFloat("MaxTime")); | |||
// load | |||
inline void StreamPluginGUI::cb_Load_i (Fl_Button* o, void* v) { | |||
char *fn=fl_file_chooser("Load a sample", "{*.wav,*.WAV}", NULL); | |||
if (fn && fn!='\0') { | |||
strcpy (m_TextBuf, fn); | |||
m_GUICH->SetData ("FileName", (void*)m_TextBuf); | |||
m_GUICH->SetCommand (StreamPlugin::LOAD); | |||
m_GUICH->Wait(); | |||
SetMaxTime (m_GUICH->GetFloat ("MaxTime")); | |||
} | |||
} | |||
void StreamPluginGUI::cb_Load(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Load_i(o,v);} | |||
inline void StreamPluginGUI::cb_Volume_i(Fl_Knob* o, void* v) | |||
{ m_GUICH->Set("Volume",(float)o->value()); } | |||
void StreamPluginGUI::cb_Volume(Fl_Knob* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Volume_i(o,v);} | |||
inline void StreamPluginGUI::cb_Pitch_i(Fl_Slider* o, void* v) | |||
{ | |||
m_GUICH->Set("Pitch",(float)o->value()-10); | |||
sprintf(PitchLabel,"%1.3f ",o->value()-10); | |||
m_Pitch->label(PitchLabel); | |||
m_PitchValue=o->value()-10; | |||
void StreamPluginGUI::cb_Load (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Load_i (o, v); | |||
} | |||
void StreamPluginGUI::cb_Pitch(Fl_Slider* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Pitch_i(o,v);} | |||
inline void StreamPluginGUI::cb_Loop_i(Fl_Button* o, void* v) //Why is this function named so. | |||
{ | |||
m_PitchValue*=2.0f; | |||
m_GUICH->Set("Pitch",m_PitchValue); | |||
sprintf(PitchLabel,"%1.3f ",m_PitchValue); | |||
m_Pitch->label(PitchLabel); | |||
m_Pitch->value(m_PitchValue+10); | |||
redraw(); | |||
// restart | |||
inline void StreamPluginGUI::cb_ToStart_i (Fl_Button* o, void* v) { | |||
m_GUICH->SetCommand (StreamPlugin::RESTART); | |||
} | |||
void StreamPluginGUI::cb_Loop(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Loop_i(o,v);} | |||
inline void StreamPluginGUI::cb_Div_i(Fl_Button* o, void* v) | |||
{ | |||
m_PitchValue/=2.0f; | |||
m_GUICH->Set("Pitch",m_PitchValue); | |||
sprintf(PitchLabel,"%1.3f ",m_PitchValue); | |||
m_Pitch->label(PitchLabel); | |||
m_Pitch->value(m_PitchValue+10); | |||
redraw(); | |||
void StreamPluginGUI::cb_ToStart (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_ToStart_i (o, v); | |||
} | |||
void StreamPluginGUI::cb_Div(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Div_i(o,v);} | |||
inline void StreamPluginGUI::cb_ToStart_i(Fl_Button* o, void* v) | |||
{ m_GUICH->SetCommand(StreamPlugin::RESTART); } | |||
void StreamPluginGUI::cb_ToStart(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_ToStart_i(o,v);} | |||
inline void StreamPluginGUI::cb_Stop_i(Fl_Button* o, void* v) | |||
{ | |||
m_TempPitch=m_PitchValue; | |||
m_PitchValue=0; | |||
m_GUICH->Set("Pitch",m_PitchValue); | |||
// stop | |||
inline void StreamPluginGUI::cb_Stop_i (Fl_Button* o, void* v) { | |||
m_GUICH->SetCommand (StreamPlugin::STOP); | |||
} | |||
void StreamPluginGUI::cb_Stop(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Stop_i(o,v);} | |||
inline void StreamPluginGUI::cb_Play_i(Fl_Button* o, void* v) | |||
{ | |||
m_PitchValue=m_TempPitch; | |||
m_GUICH->Set("Pitch",m_PitchValue); | |||
void StreamPluginGUI::cb_Stop (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Stop_i (o, v); | |||
} | |||
void StreamPluginGUI::cb_Play(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Play_i(o,v);} | |||
inline void StreamPluginGUI::cb_Reset_i(Fl_Button* o, void* v) | |||
{ | |||
m_GUICH->Set("Pitch",1.0f); | |||
sprintf(PitchLabel,"%1.3f ",1.0); | |||
m_Pitch->label(PitchLabel); | |||
m_Pitch->value(11); | |||
m_PitchValue=1.0f; | |||
redraw(); | |||
// play | |||
inline void StreamPluginGUI::cb_Play_i (Fl_Button* o, void* v) { | |||
m_GUICH->SetCommand (StreamPlugin::PLAY); | |||
} | |||
void StreamPluginGUI::cb_Reset(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Reset_i(o,v);} | |||
inline void StreamPluginGUI::cb_Nudge_i(Fl_Button* o, void* v) | |||
{ | |||
m_GUICH->SetCommand(StreamPlugin::NUDGE); | |||
void StreamPluginGUI::cb_Play (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Play_i (o, v); | |||
} | |||
void StreamPluginGUI::cb_Nudge(Fl_Button* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Nudge_i(o,v);} | |||
inline void StreamPluginGUI::cb_Pos_i(Fl_Slider* o, void* v) | |||
{ | |||
m_GUICH->Set("Time",(float)o->value()); | |||
m_GUICH->SetCommand(StreamPlugin::SET_TIME); | |||
// div 2 | |||
inline void StreamPluginGUI::cb_Div_i (Fl_Button* o, void* v) { | |||
m_PitchValue /= 2.0f; | |||
UpdatePitch (); | |||
} | |||
void StreamPluginGUI::cb_Div (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent()))->cb_Div_i (o, v); | |||
} | |||
void StreamPluginGUI::cb_Pos(Fl_Slider* o, void* v) | |||
{ ((StreamPluginGUI*)(o->parent()))->cb_Pos_i(o,v);} | |||
const string StreamPluginGUI::GetHelpText(const string &loc){ | |||
return string("") | |||
+ "If you want to mix whole tracks and add effects etc, then this is the\n" | |||
+ "way to do it. The StreamPlugin loads a wav in bit by bit, so it doesn't\n" | |||
// reset | |||
inline void StreamPluginGUI::cb_Reset_i (Fl_Button* o, void* v) { | |||
m_PitchValue = 1.0f; | |||
UpdatePitch (); | |||
} | |||
void StreamPluginGUI::cb_Reset (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Reset_i (o, v); | |||
} | |||
// mul 2 | |||
inline void StreamPluginGUI::cb_Dbl_i (Fl_Button* o, void* v) { | |||
m_PitchValue *= 2.0f; | |||
UpdatePitch (); | |||
} | |||
void StreamPluginGUI::cb_Dbl (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Dbl_i (o, v); | |||
} | |||
//nudge | |||
inline void StreamPluginGUI::cb_Nudge_i (Fl_Button* o, void* v) { | |||
int NudgeSize = 1; | |||
if (m_PitchValue < 0) NudgeSize = -NudgeSize; | |||
float P = m_Pos->value() + NudgeSize; | |||
if (P < 0) P = 0; | |||
if (P > m_Pos->maximum()) P = m_Pos->maximum(); | |||
m_Pos->value (P); | |||
m_GUICH->Set ("Time", P); | |||
m_GUICH->SetCommand (StreamPlugin::SET_TIME); | |||
} | |||
void StreamPluginGUI::cb_Nudge (Fl_Button* o, void* v) { | |||
((StreamPluginGUI*)(o->parent ()))->cb_Nudge_i (o, v); | |||
} | |||
// help text | |||
const string StreamPluginGUI::GetHelpText (const string &loc){ | |||
return string("") | |||
+ "If you want to mix whole tracks and add effects etc, then this is the\n" | |||
+ "way to do it. The StreamPlugin loads a wav in bit by bit, so it doesn't\n" | |||
+ "use much memory. The track can be pitched for mixing.\n" | |||
+ "Operates pretty much like a media player such as XMMS (only wav\n" | |||
+ "format though).\n\n" | |||
+ "Connect the finish trigger to the stop trigger to play the wav only\nonce.\n\n" | |||
+ "Note: Not realtime safe, if you're using JACK, use a client such as\n" | |||
+ "alsaplayer."; | |||
} | |||
@@ -14,90 +14,71 @@ | |||
* 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 <FL/Fl.H> | |||
#include <FL/Fl_Window.H> | |||
#include <FL/Fl_Group.H> | |||
#include <FL/Fl_Counter.H> | |||
#include <FL/Fl_Slider.H> | |||
#include <FL/Fl_Output.H> | |||
#include <FL/Fl_Repeat_Button.H> | |||
#include "StreamPlugin.h" | |||
#include "../SpiralPluginGUI.h" | |||
#include "../Widgets/Fl_Knob.H" | |||
#include "../Widgets/Fl_SevenSeg.H" | |||
#include "../Widgets/Fl_Knob.H" | |||
#ifndef MixerGUI | |||
#define MixerGUI | |||
class StreamPluginGUI; | |||
class StreamPluginGUI : public SpiralPluginGUI | |||
{ | |||
public: | |||
StreamPluginGUI(int w, int h, StreamPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
virtual ~StreamPluginGUI(); | |||
virtual void Update(); | |||
virtual void UpdateValues(SpiralPlugin *o); | |||
//void SetTime(); | |||
void SetMaxTime(float t) { m_Pos->maximum(t); } | |||
protected: | |||
const string GetHelpText(const string &loc); | |||
private: | |||
Fl_Button* m_Load; | |||
Fl_Knob* m_Volume; | |||
Fl_Slider* m_Pitch; | |||
Fl_Button* m_Loop; | |||
Fl_Button* m_ToStart; | |||
Fl_Button* m_Stop; | |||
Fl_Button* m_Play; | |||
Fl_Button* m_Reset; | |||
Fl_Button* m_Div; | |||
Fl_Repeat_Button* m_Nudge; | |||
Fl_Output* m_Pout; | |||
Fl_SevenSeg* m_Display[6]; | |||
Fl_Slider* m_Pos; | |||
char m_TextBuf[256]; | |||
float m_PitchValue; | |||
float m_TempPitch; | |||
//// Callbacks //// | |||
inline void cb_Load_i(Fl_Button* o, void* v); | |||
static void cb_Load(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_Slider* o, void* v); | |||
static void cb_Pitch(Fl_Slider* 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_Div_i(Fl_Button* o, void* v); | |||
static void cb_Div(Fl_Button* o, void* v); | |||
inline void cb_ToStart_i(Fl_Button* o, void* v); | |||
static void cb_ToStart(Fl_Button* o, void* v); | |||
inline void cb_Stop_i(Fl_Button* o, void* v); | |||
static void cb_Stop(Fl_Button* o, void* v); | |||
inline void cb_Play_i(Fl_Button* o, void* v); | |||
static void cb_Play(Fl_Button* o, void* v); | |||
inline void cb_Reset_i(Fl_Button* o, void* v); | |||
static void cb_Reset(Fl_Button* o, void* v); | |||
inline void cb_Nudge_i(Fl_Button* o, void* v); | |||
static void cb_Nudge(Fl_Button* o, void* v); | |||
inline void cb_Pos_i(Fl_Slider* o, void* v); | |||
static void cb_Pos(Fl_Slider* o, void* v); | |||
#ifndef StreamGUI | |||
#define StreamGUI | |||
class StreamPluginGUI : public SpiralPluginGUI { | |||
public: | |||
StreamPluginGUI(int w, int h, StreamPlugin *o, ChannelHandler *ch, const HostInfo *Info); | |||
virtual ~StreamPluginGUI (); | |||
virtual void Update (); | |||
virtual void UpdateValues (SpiralPlugin *o); | |||
protected: | |||
const string GetHelpText (const string &loc); | |||
private: | |||
float m_PitchValue; | |||
char m_TextBuf[256]; | |||
void SetMaxTime (float t) { m_Pos->maximum(t); } | |||
void UpdatePitch (bool UpdateIt = true, bool DrawIt = true, bool SendIt = true); | |||
// Widgets | |||
Fl_SevenSeg* m_Display[6]; | |||
Fl_Knob* m_Volume; | |||
Fl_Slider* m_Pitch; | |||
Fl_Slider* m_Pos; | |||
Fl_Button* m_Load; | |||
Fl_Button* m_ToStart; | |||
Fl_Button* m_Stop; | |||
Fl_Button* m_Play; | |||
Fl_Button* m_Div; | |||
Fl_Button* m_Reset; | |||
Fl_Button* m_Dbl; | |||
Fl_Repeat_Button* m_Nudge; | |||
//// Callbacks //// | |||
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_Slider* o, void* v); | |||
static void cb_Pitch (Fl_Slider* o, void* v); | |||
inline void cb_Pos_i (Fl_Slider* o, void* v); | |||
static void cb_Pos (Fl_Slider* o, void* v); | |||
inline void cb_Load_i (Fl_Button* o, void* v); | |||
static void cb_Load (Fl_Button* o, void* v); | |||
inline void cb_ToStart_i (Fl_Button* o, void* v); | |||
static void cb_ToStart (Fl_Button* o, void* v); | |||
inline void cb_Stop_i (Fl_Button* o, void* v); | |||
static void cb_Stop (Fl_Button* o, void* v); | |||
inline void cb_Play_i (Fl_Button* o, void* v); | |||
static void cb_Play (Fl_Button* o, void* v); | |||
inline void cb_Div_i (Fl_Button* o, void* v); | |||
static void cb_Div (Fl_Button* o, void* v); | |||
inline void cb_Reset_i (Fl_Button* o, void* v); | |||
static void cb_Reset (Fl_Button* o, void* v); | |||
inline void cb_Dbl_i (Fl_Button* o, void* v); | |||
static void cb_Dbl (Fl_Button* o, void* v); | |||
inline void cb_Nudge_i (Fl_Button* o, void* v); | |||
static void cb_Nudge (Fl_Button* o, void* v); | |||
}; | |||
#endif |