home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / buzzmachines_massive.exe / Dev / MachineInterface.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-08-26  |  15.5 KB  |  518 lines

  1. // Copyright (C) 1997-2000 Oskari Tammelin (ot@iki.fi)
  2. // This header file may be used to write _freeware_ DLL "machines" for Buzz
  3. // Using it for anything else is not allowed without a permission from the author
  4.    
  5. #ifndef __MACHINE_INTERFACE_H
  6. #define __MACHINE_INTERFACE_H
  7.  
  8. #include <stdio.h>
  9. #include <assert.h>
  10. #include <string.h>
  11.  
  12. #define MI_VERSION                15
  13.   
  14. typedef unsigned char byte;
  15. typedef unsigned short word;
  16. typedef unsigned long dword;
  17.  
  18. double const PI = 3.14159265358979323846;
  19.  
  20. #define MAX_BUFFER_LENGTH        256            // in number of samples
  21.  
  22. // machine types
  23. #define MT_MASTER                0 
  24. #define MT_GENERATOR            1
  25. #define MT_EFFECT                2
  26.  
  27. // special parameter values
  28. #define NOTE_NO                    0
  29. #define NOTE_OFF                255
  30. #define NOTE_MIN                1                    // C-0
  31. #define NOTE_MAX                ((16 * 9) + 12)        // B-9
  32. #define SWITCH_OFF                0
  33. #define SWITCH_ON                1
  34. #define SWITCH_NO                255
  35. #define WAVE_MIN                1
  36. #define WAVE_MAX                200
  37. #define WAVE_NO                    0
  38.  
  39. // CMachineParameter flags
  40. #define MPF_WAVE                1
  41. #define MPF_STATE                2    
  42. #define MPF_TICK_ON_EDIT        4                
  43.  
  44. // CMachineInfo flags
  45. #define MIF_MONO_TO_STEREO        (1<<0)
  46. #define MIF_PLAYS_WAVES            (1<<1)
  47. #define MIF_USES_LIB_INTERFACE    (1<<2)
  48. #define MIF_USES_INSTRUMENTS    (1<<3)
  49. #define MIF_DOES_INPUT_MIXING    (1<<4)
  50. #define MIF_NO_OUTPUT            (1<<5)        // used for effect machines that don't actually use any outputs (WaveOutput, AuxSend etc.)
  51. #define MIF_CONTROL_MACHINE        (1<<6)        // used to control other (non MIF_CONTROL_MACHINE) machines
  52. #define MIF_INTERNAL_AUX        (1<<7)        // uses internal aux bus (jeskola mixer and jeskola mixer aux)
  53.  
  54. // work modes
  55. #define WM_NOIO                    0
  56. #define WM_READ                    1
  57. #define WM_WRITE                2
  58. #define WM_READWRITE            3
  59.  
  60. // state flags
  61. #define SF_PLAYING                1
  62. #define SF_RECORDING            2
  63.  
  64.  
  65. enum BEventType
  66. {
  67.     DoubleClickMachine,                    // return true to ignore default handler (open parameter dialog), no parameters
  68.     gDeleteMachine                        // data = CMachine *, param = ThisMac
  69.         
  70. };
  71.  
  72. class CMachineInterface;
  73. typedef bool (CMachineInterface::*EVENT_HANDLER_PTR)(void *);
  74.  
  75.  
  76. enum CMPType { pt_note, pt_switch, pt_byte, pt_word };
  77.  
  78. class CMachineParameter
  79. {
  80. public:
  81.  
  82.     CMPType Type;            // pt_byte
  83.     char const *Name;        // Short name: "Cutoff"
  84.     char const *Description;// Longer description: "Cutoff Frequency (0-7f)"
  85.     int MinValue;            // 0
  86.     int MaxValue;            // 127
  87.     int NoValue;            // 255
  88.     int Flags;
  89.     int DefValue;            // default value for params that have MPF_STATE flag set
  90. };
  91.  
  92. class CMachineAttribute
  93. {
  94. public:
  95.     char const *Name;
  96.     int MinValue;
  97.     int MaxValue;
  98.     int DefValue;
  99. };
  100.  
  101. class CMasterInfo
  102. {
  103. public:
  104.     int BeatsPerMin;        // [16..500]     
  105.     int TicksPerBeat;        // [1..32]
  106.     int SamplesPerSec;        // usually 44100, but machines should support any rate from 11050 to 96000
  107.     int SamplesPerTick;        // (int)((60 * SPS) / (BPM * TPB))  
  108.     int PosInTick;            // [0..SamplesPerTick-1]
  109.     float TicksPerSec;        // (float)SPS / (float)SPT  
  110.  
  111. };
  112.  
  113. // CWaveInfo flags
  114. #define WF_LOOP            1
  115. #define WF_STEREO        8
  116. #define WF_BIDIR_LOOP    16
  117.  
  118. class CWaveInfo
  119. {
  120. public:
  121.     int Flags;
  122.     float Volume;
  123.  
  124. };
  125.  
  126. class CWaveLevel
  127. {
  128. public:
  129.     int numSamples;
  130.     short *pSamples;
  131.     int RootNote;
  132.     int SamplesPerSec;
  133.     int LoopStart;
  134.     int LoopEnd;
  135. };
  136.  
  137. // oscillator waveforms (used with GetOscillatorTable function)
  138. #define OWF_SINE            0
  139. #define OWF_SAWTOOTH        1
  140. #define OWF_PULSE            2        // square 
  141. #define OWF_TRIANGLE        3
  142. #define OWF_NOISE            4    
  143. #define OWF_303_SAWTOOTH    5
  144.  
  145. // each oscillator table contains one full cycle of a bandlimited waveform at 11 levels
  146. // level 0 = 2048 samples  
  147. // level 1 = 1024 samples
  148. // level 2 = 512 samples
  149. // ... 
  150. // level 9 = 8 samples 
  151. // level 10 = 4 samples
  152. // level 11 = 2 samples
  153. //
  154. // the waves are normalized to 16bit signed integers   
  155. //
  156. // GetOscillatorTable retusns pointer to a table 
  157. // GetOscTblOffset returns offset in the table for a specified level 
  158.  
  159. inline int GetOscTblOffset(int const level)
  160. {
  161.     assert(level >= 0 && level <= 10);
  162.     return (2048+1024+512+256+128+64+32+16+8+4) & ~((2048+1024+512+256+128+64+32+16+8+4) >> level);
  163. }
  164.  
  165. class CPattern;
  166. class CSequence;
  167. class CMachineInterfaceEx;
  168. class CMachine;
  169.  
  170. class CMachineDataOutput;
  171. class CMachineInfo;
  172.  
  173. class CMICallbacks
  174. {
  175. public:
  176.     virtual CWaveInfo const *GetWave(int const i);
  177.     virtual CWaveLevel const *GetWaveLevel(int const i, int const level);
  178.     virtual void MessageBox(char const *txt);
  179.     virtual void Lock();
  180.     virtual void Unlock();
  181.     virtual int GetWritePos();            
  182.     virtual int GetPlayPos();    
  183.     virtual float *GetAuxBuffer();
  184.     virtual void ClearAuxBuffer();
  185.     virtual int GetFreeWave();
  186.     virtual bool AllocateWave(int const i, int const size, char const *name);
  187.     virtual void ScheduleEvent(int const time, dword const data);
  188.     virtual void MidiOut(int const dev, dword const data);
  189.     virtual short const *GetOscillatorTable(int const waveform);
  190.  
  191.     // envelopes
  192.     virtual int GetEnvSize(int const wave, int const env);
  193.     virtual bool GetEnvPoint(int const wave, int const env, int const i, word &x, word &y, int &flags);
  194.  
  195.     virtual CWaveLevel const *GetNearestWaveLevel(int const i, int const note);
  196.     
  197.     // pattern editing
  198.     virtual void SetNumberOfTracks(int const n);
  199.     virtual CPattern *CreatePattern(char const *name, int const length);
  200.     virtual CPattern *GetPattern(int const index);
  201.     virtual char const *GetPatternName(CPattern *ppat);
  202.     virtual void RenamePattern(char const *oldname, char const *newname);
  203.     virtual void DeletePattern(CPattern *ppat);
  204.     virtual int GetPatternData(CPattern *ppat, int const row, int const group, int const track, int const field);
  205.     virtual void SetPatternData(CPattern *ppat, int const row, int const group, int const track, int const field, int const value);
  206.          
  207.     // sequence editing
  208.     virtual CSequence *CreateSequence();
  209.     virtual void DeleteSequence(CSequence *pseq);
  210.     
  211.  
  212.     // special ppat values for GetSequenceData and SetSequenceData 
  213.     // empty = NULL
  214.     // <break> = (CPattern *)1
  215.     // <mute> = (CPattern *)2
  216.     // <thru> = (CPattern *)3
  217.     virtual CPattern *GetSequenceData(int const row);
  218.     virtual void SetSequenceData(int const row, CPattern *ppat);
  219.         
  220.  
  221.     // buzz v1.2 (MI_VERSION 15) additions start here
  222.     
  223.     virtual void SetMachineInterfaceEx(CMachineInterfaceEx *pex);
  224.     // group 1=global, 2=track
  225.     virtual void ControlChange__obsolete__(int group, int track, int param, int value);                        // set value of parameter
  226.     
  227.     // direct calls to audiodriver, used by WaveInput and WaveOutput
  228.     // shouldn't be used for anything else
  229.     virtual int ADGetnumChannels(bool input);
  230.     virtual void ADWrite(int channel, float *psamples, int numsamples);
  231.     virtual void ADRead(int channel, float *psamples, int numsamples);
  232.  
  233.     virtual CMachine *GetThisMachine();    // only call this in Init()!
  234.     virtual void ControlChange(CMachine *pmac, int group, int track, int param, int value);        // set value of parameter (group & 16 == don't record)
  235.  
  236.     // returns pointer to the sequence if there is a pattern playing
  237.     virtual CSequence *GetPlayingSequence(CMachine *pmac);
  238.  
  239.     // gets ptr to raw pattern data for row of a track of a currently playing pattern (or something like that)
  240.     virtual void *GetPlayingRow(CSequence *pseq, int group, int track);
  241.  
  242.     virtual int GetStateFlags();
  243.  
  244.     virtual void SetnumOutputChannels(CMachine *pmac, int n);    // if n=1 Work(), n=2 WorkMonoToStereo()
  245.  
  246.     virtual void SetEventHandler(CMachine *pmac, BEventType et, EVENT_HANDLER_PTR p, void *param);
  247.  
  248.     virtual char const *GetWaveName(int const i);
  249.  
  250.     virtual void SetInternalWaveName(CMachine *pmac, int const i, char const *name);    // i >= 1, NULL name to clear
  251.  
  252.     virtual void GetMachineNames(CMachineDataOutput *pout);        // *pout will get one name per Write()
  253.     virtual CMachine *GetMachine(char const *name);
  254.     virtual CMachineInfo const *GetMachineInfo(CMachine *pmac);
  255.     virtual char const *GetMachineName(CMachine *pmac);
  256.  
  257.     virtual bool GetInput(int index, float *psamples, int numsamples, bool stereo, float *extrabuffer);
  258. };
  259.  
  260.  
  261. class CLibInterface
  262. {
  263. public:
  264.     virtual void GetInstrumentList(CMachineDataOutput *pout) {}            
  265.     
  266.     // make some space to vtable so this interface can be extended later 
  267.     virtual void Dummy1() {}
  268.     virtual void Dummy2() {}
  269.     virtual void Dummy3() {}
  270.     virtual void Dummy4() {}
  271.     virtual void Dummy5() {}
  272.     virtual void Dummy6() {}
  273.     virtual void Dummy7() {}
  274.     virtual void Dummy8() {}
  275.     virtual void Dummy9() {}
  276.     virtual void Dummy10() {}
  277.     virtual void Dummy11() {}
  278.     virtual void Dummy12() {}
  279.     virtual void Dummy13() {}
  280.     virtual void Dummy14() {}
  281.     virtual void Dummy15() {}
  282.     virtual void Dummy16() {}
  283.     virtual void Dummy17() {}
  284.     virtual void Dummy18() {}
  285.     virtual void Dummy19() {}
  286.     virtual void Dummy20() {}
  287.     virtual void Dummy21() {}
  288.     virtual void Dummy22() {}
  289.     virtual void Dummy23() {}
  290.     virtual void Dummy24() {}
  291.     virtual void Dummy25() {}
  292.     virtual void Dummy26() {}
  293.     virtual void Dummy27() {}
  294.     virtual void Dummy28() {}
  295.     virtual void Dummy29() {}
  296.     virtual void Dummy30() {}
  297.     virtual void Dummy31() {}
  298.     virtual void Dummy32() {}
  299.  
  300.  
  301. };
  302.  
  303.  
  304. class CMachineInfo
  305. {
  306. public:
  307.     int Type;                                // MT_GENERATOR or MT_EFFECT, 
  308.     int Version;                            // MI_VERSION
  309.                                             // v1.2: high word = internal machine version
  310.                                             // higher version wins if two copies of machine found
  311.     int Flags;                
  312.     int minTracks;                            // [0..256] must be >= 1 if numTrackParameters > 0 
  313.     int maxTracks;                            // [minTracks..256] 
  314.     int numGlobalParameters;                
  315.     int numTrackParameters;                    
  316.     CMachineParameter const **Parameters;
  317.     int numAttributes;
  318.     CMachineAttribute const **Attributes;
  319.     char const *Name;                        // "Jeskola Reverb"
  320.     char const *ShortName;                    // "Reverb"
  321.     char const *Author;                        // "Oskari Tammelin"
  322.     char const *Commands;                    // "Command1\nCommand2\nCommand3..."
  323.     CLibInterface *pLI;                        // ignored if MIF_USES_LIB_INTERFACE is not set
  324. };
  325.  
  326. class CMachineDataInput
  327. {
  328. public:
  329.     virtual void Read(void *pbuf, int const numbytes);
  330.  
  331.     void Read(int &d) { Read(&d, sizeof(int)); }
  332.     void Read(dword &d) { Read(&d, sizeof(dword)); }
  333.     void Read(short &d) { Read(&d, sizeof(short)); }
  334.     void Read(word &d) { Read(&d, sizeof(word)); }
  335.     void Read(char &d) { Read(&d, sizeof(char)); }
  336.     void Read(byte &d) { Read(&d, sizeof(byte)); }
  337.     void Read(float &d) { Read(&d, sizeof(float)); }
  338.     void Read(double &d) { Read(&d, sizeof(double)); }
  339.     void Read(bool &d) { Read(&d, sizeof(bool)); }
  340.  
  341. };
  342.  
  343. class CMachineDataOutput
  344. {
  345. public:
  346.     virtual void Write(void *pbuf, int const numbytes);
  347.  
  348.     void Write(int d) { Write(&d, sizeof(int)); }
  349.     void Write(dword d) { Write(&d, sizeof(dword)); }
  350.     void Write(short d) { Write(&d, sizeof(short)); }
  351.     void Write(word d) { Write(&d, sizeof(word)); }
  352.     void Write(char d) { Write(&d, sizeof(char)); }
  353.     void Write(byte d) { Write(&d, sizeof(byte)); }
  354.     void Write(float d) { Write(&d, sizeof(float)); }
  355.     void Write(double d) { Write(&d, sizeof(double)); }
  356.     void Write(bool d) { Write(&d, sizeof(bool)); }
  357.     void Write(char const *str) { Write((void *)str, strlen(str)+1); }
  358.  
  359. };
  360.  
  361. // envelope info flags
  362. #define EIF_SUSTAIN            1
  363. #define EIF_LOOP            2
  364.  
  365. class CEnvelopeInfo
  366. {
  367. public:
  368.     char const *Name;
  369.     int Flags;
  370. };
  371.  
  372. class CMachineInterface
  373. {
  374. public:
  375.     virtual ~CMachineInterface() {}
  376.     virtual void Init(CMachineDataInput * const pi) {}
  377.     virtual void Tick() {}
  378.     virtual bool Work(float *psamples, int numsamples, int const mode) { return false; }
  379.     virtual bool WorkMonoToStereo(float *pin, float *pout, int numsamples, int const mode) { return false; }
  380.     virtual void Stop() {}
  381.     virtual void Save(CMachineDataOutput * const po) {}
  382.     virtual void AttributesChanged() {}
  383.     virtual void Command(int const i) {}
  384.  
  385.     virtual void SetNumTracks(int const n) {}
  386.     virtual void MuteTrack(int const i) {}
  387.     virtual bool IsTrackMuted(int const i) const { return false; }
  388.  
  389.     virtual void MidiNote(int const channel, int const value, int const velocity) {}
  390.     virtual void Event(dword const data) {}
  391.  
  392.     virtual char const *DescribeValue(int const param, int const value) { return NULL; }
  393.  
  394.     virtual CEnvelopeInfo const **GetEnvelopeInfos() { return NULL; }
  395.  
  396.     virtual bool PlayWave(int const wave, int const note, float const volume) { return false; }
  397.     virtual void StopWave() {}
  398.     virtual int GetWaveEnvPlayPos(int const env) { return -1; }
  399.  
  400.  
  401. public:
  402.     // initialize these members in the constructor 
  403.     void *GlobalVals;
  404.     void *TrackVals;
  405.     int *AttrVals;
  406.         
  407.     // these members are initialized by the 
  408.     // engine right after it calls CreateMachine()
  409.     // don't touch them in the constructor
  410.     CMasterInfo *pMasterInfo;
  411.     CMICallbacks *pCB;                    
  412.  
  413. };
  414.  
  415. // buzz v1.2 extended machine interface
  416. class CMachineInterfaceEx
  417. {
  418. public:
  419.     virtual char const *DescribeParam(int const param) { return NULL; }        // use this to dynamically change name of parameter
  420.     virtual bool SetInstrument(char const *name) { return false; }
  421.  
  422.     virtual void GetSubMenu(int const i, CMachineDataOutput *pout) {}
  423.  
  424.     virtual void AddInput(char const *macname, bool stereo) {}    // called when input is added to a machine
  425.     virtual void DeleteInput(char const *macename) {}            
  426.     virtual void RenameInput(char const *macoldname, char const *macnewname) {}
  427.  
  428.     virtual void Input(float *psamples, int numsamples, float amp) {} // if MIX_DOES_INPUT_MIXING
  429.  
  430.     virtual void MidiControlChange(int const ctrl, int const channel, int const value) {}
  431.  
  432.     virtual void SetInputChannels(char const *macname, bool stereo) {}
  433.  
  434.     virtual bool HandleInput(int index, int amp, int pan) { return false; }
  435.  
  436.     // make some space to vtable so this interface can be extended later 
  437.     virtual void Dummy1() {}
  438.     virtual void Dummy2() {}
  439.     virtual void Dummy3() {}
  440.     virtual void Dummy4() {}
  441.     virtual void Dummy5() {}
  442.     virtual void Dummy6() {}
  443.     virtual void Dummy7() {}
  444.     virtual void Dummy8() {}
  445.     virtual void Dummy9() {}
  446.     virtual void Dummy10() {}
  447.     virtual void Dummy11() {}
  448.     virtual void Dummy12() {}
  449.     virtual void Dummy13() {}
  450.     virtual void Dummy14() {}
  451.     virtual void Dummy15() {}
  452.     virtual void Dummy16() {}
  453.     virtual void Dummy17() {}
  454.     virtual void Dummy18() {}
  455.     virtual void Dummy19() {}
  456.     virtual void Dummy20() {}
  457.     virtual void Dummy21() {}
  458.     virtual void Dummy22() {}
  459.     virtual void Dummy23() {}
  460.     virtual void Dummy24() {}
  461.     virtual void Dummy25() {}
  462.     virtual void Dummy26() {}
  463.     virtual void Dummy27() {}
  464.     virtual void Dummy28() {}
  465.     virtual void Dummy29() {}
  466.     virtual void Dummy30() {}
  467.     virtual void Dummy31() {}
  468.     virtual void Dummy32() {}
  469.  
  470. };
  471.  
  472. class CMILock
  473. {
  474. public:
  475.     CMILock(CMICallbacks *p) { pCB = p; pCB->Lock(); }
  476.     ~CMILock() { pCB->Unlock(); }
  477. private:
  478.     CMICallbacks *pCB;
  479. };
  480.  
  481. #define MACHINE_LOCK CMILock __machinelock(pCB);
  482.  
  483. #ifdef STATIC_BUILD
  484.  
  485.     typedef CMachineInfo const *(__cdecl *GET_INFO)();                                                
  486.     typedef CMachineInterface *(__cdecl *CREATE_MACHINE)();                                        
  487.  
  488.     extern void RegisterMachine(CMachineInfo const *pmi, GET_INFO gi, CREATE_MACHINE cm);    
  489.  
  490. #define DLL_EXPORTS(INIT_FUNC)                                                            \
  491.     static CMachineInfo const * __cdecl GetInfo() { return &MacInfo; }                    \
  492.     static CMachineInterface * __cdecl CreateMachine() { return new mi; }                \
  493.     void INIT_FUNC() { RegisterMachine(&MacInfo, GetInfo, CreateMachine); }                \
  494.  
  495.  
  496. #define DLL_EXPORTS_NS(NS, INIT_FUNC) /* namespaced version */                                 \
  497.     static CMachineInfo const * __cdecl GetInfo() { return &NS::MacInfo; }                    \
  498.     static CMachineInterface * __cdecl CreateMachine() { return new NS::mi; }                \
  499.     void INIT_FUNC() { RegisterMachine(&NS::MacInfo, GetInfo, CreateMachine); }                \
  500.  
  501.  
  502.  
  503. #else
  504.  
  505.     #define DLL_EXPORTS extern "C" { \
  506.     __declspec(dllexport) CMachineInfo const * __cdecl GetInfo() \
  507.     { \
  508.         return &MacInfo; \
  509.     } \
  510.     __declspec(dllexport) CMachineInterface * __cdecl CreateMachine() \
  511.     { \
  512.         return new mi; \
  513.     } \
  514.     } 
  515.  
  516. #endif
  517.  
  518. #endif