/* SpiralLoops * Copyleft (C) 2000 David Griffiths * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * 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. */ #ifndef LOOP #define LOOP #include "SpiralSound/Filter.h" #include "GUI/LoopGUI.h" #include "../../Sample.h" class Loop { public: Loop(); ~Loop(); void LoadWav(const char *Filename); void SaveWav(const char *Filename); bool GetOutput(Sample &data); void AllocateMem(int Length); void Clear(); void Hold() {m_StoreBuffer=m_HoldBuffer;} void Double(); void MatchLength(int Len); void Crop(); void StreamIn(istream &s); void StreamOut(ostream &s); void SetGUI(LoopGUI *s) { m_GUI=s; } void SetId(int Id) { m_Id=Id; } void SetCutoff(int c) { m_Filter.SetCutoff(c); } void SetResonance(int r) { m_Filter.SetResonance(r); } void SetPos(int Pos) { m_Pos=Pos; } void SetLength(int Len) { m_LoopPoint=Len; } void SetSpeed(float Speed) { m_Speed=Speed; } void SetVolume(float Vol) { m_Volume=Vol; } void SetPlaying(bool Playing) { m_Playing=Playing; } void SetRecordingSource(const float *s) { m_RecordingSource=s; } void Record(bool r) { m_Recording=r; if (!r) EndRecordBuf(); } void SetMasterStatus(bool m) { m_Master=m; } void FilterBypass(bool s) { m_Filter.FilterBypass(s); } void DelMe() { m_DelMe=true; } void SetBalance(float s) { m_Balance=s; m_LeftVol=(2-s)/2; m_RightVol=(1+s-1.0f)/2;} void Trigger() { m_Pos=0; SetPlaying(true); } void SetEffects(bool s) { m_EffectsOn=s; } const float GetVolume() {return m_Volume;} const float GetCutoff() {return m_Filter.GetCutoff();} const float GetResonance() {return m_Filter.GetCutoff();} const float GetBalance() {return m_Balance;} const bool GetEffects() {return m_EffectsOn;} const bool IsPlaying() {return m_Playing;} const float *GetLoopPtr() {return m_StoreBuffer.GetBuffer();} const int GetId() {return m_Id;} const int GetLoopLength() {return m_LoopPoint;} float *GetPosPtr() {return &m_Pos;} const int GetTotalLength() {assert(m_StoreBuffer.GetLength()==m_HoldBuffer.GetLength()); return m_StoreBuffer.GetLength();} const bool IsMaster() {return m_Master;} const bool Delete() {return m_DelMe; } const float GetSpeed() {return m_Speed;} const float GetLeftVol() { return m_LeftVol; } const float GetRightVol() { return m_RightVol; } const float GetCurrentAngle() { return m_LoopPoint?(m_Pos/m_LoopPoint)*360.0f:0; } const string& GetSampleName() { return m_Sample; } void Cut(int Start, int End); void Copy(int Start, int End); void Paste(int Start); void PasteMix(int Start); void ZeroRange(int Start, int End); void ReverseRange(int Start, int End); void Halve(); void SelectAll(); void Move(int Start); private: void RecordBuf(float Pos, int Length); void EndRecordBuf(); Filter m_Filter; int m_Id; float m_Pos; int m_IntPos; int m_PlayBufPos; bool m_Playing; bool m_Recording; bool m_Master; bool m_DelMe; long int m_LoopPoint; float m_Speed; float m_Volume; const float *m_RecordingSource; Sample m_StoreBuffer; Sample m_HoldBuffer; Sample m_RecBuffer; int m_RecPos; float m_Balance; float m_LeftVol,m_RightVol; bool m_FirstRecord; bool m_FixedRecord; int m_RecLength; bool m_EffectsOn; string m_Sample; LoopGUI *m_GUI; friend istream &operator>>(istream &s, Loop &o); friend ostream &operator<<(ostream &s, Loop &o); }; istream &operator>>(istream &s, Loop &o); ostream &operator<<(ostream &s, Loop &o); #endif