/[svn]/linuxsampler/trunk/src/engines/EngineChannel.h
ViewVC logotype

Annotation of /linuxsampler/trunk/src/engines/EngineChannel.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2121 - (hide annotations) (download) (as text)
Tue Sep 14 17:09:08 2010 UTC (13 years, 7 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 14806 byte(s)
* implemented Roland GS NRPN 1ArrH which allows to set volume per note
* implemented Roland GS NRPN 1CrrH which allows to set pan per note
* implemented Roland GS NRPN 1DrrH which allows to set reverb send per
  note (in this implementation of the sampler its simply hard routed to
  the 1st effect send of the sampler channel, no matter what the actual
  effect type is)
* implemented Roland GS NRPN 1ErrH which allows to set chorus send per
  note (in this implementation of the sampler its simply hard routed to
  the 2nd effect send of the sampler channel, no matter what the actual
  effect type is)
* bumped version to 1.0.0cvs4

1 schoenebeck 889 /***************************************************************************
2     * *
3 schoenebeck 2121 * Copyright (C) 2005 - 2010 Christian Schoenebeck *
4 schoenebeck 889 * *
5     * This program is free software; you can redistribute it and/or modify *
6     * it under the terms of the GNU General Public License as published by *
7     * the Free Software Foundation; either version 2 of the License, or *
8     * (at your option) any later version. *
9     * *
10     * This program is distributed in the hope that it will be useful, *
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13     * GNU General Public License for more details. *
14     * *
15     * You should have received a copy of the GNU General Public License *
16     * along with this program; if not, write to the Free Software *
17     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
18     * MA 02111-1307 USA *
19     ***************************************************************************/
20    
21     #ifndef __LS_ENGINECHANNEL_H__
22     #define __LS_ENGINECHANNEL_H__
23    
24 iliev 1130 #include "../EventListeners.h"
25 schoenebeck 889 #include "../drivers/audio/AudioOutputDevice.h"
26     #include "../drivers/midi/midi.h"
27     #include "../drivers/midi/MidiInputDevice.h"
28     #include "../drivers/midi/MidiInputPort.h"
29 schoenebeck 1686 #include "../drivers/midi/VirtualMidiDevice.h"
30 schoenebeck 889 #include "Engine.h"
31 schoenebeck 1001 #include "FxSend.h"
32 schoenebeck 889
33     namespace LinuxSampler {
34    
35     // just symbol prototyping
36 iliev 1761 class Sampler;
37     class SamplerChannel;
38 schoenebeck 889 class AudioOutputDevice;
39     class MidiInputPort;
40 schoenebeck 1001 class FxSend;
41 schoenebeck 889
42 schoenebeck 1001
43 schoenebeck 889 /** @brief Channel Interface for LinuxSampler Sampler Engines
44     *
45     * Every sampler engine can be used on several sampler channels and
46     * usually the same Engine instance is used on multiple sampler
47     * channels. For this every sampler engine must also implement a class
48     * which handles all channel dependant parameters and channel
49     * dependant execution code.
50     *
51     * This abstract base interface class defines all mandatory methods
52     * which have to be implemented by all engine channel implementations.
53     */
54     class EngineChannel {
55     public:
56    
57     /////////////////////////////////////////////////////////////////
58     // abstract methods
59     // (these have to be implemented by the descendant)
60    
61     virtual void PrepareLoadInstrument(const char* FileName, uint Instrument) = 0;
62     virtual void LoadInstrument() = 0;
63     virtual void Reset() = 0;
64     virtual void SendNoteOn(uint8_t Key, uint8_t Velocity) = 0;
65 schoenebeck 906 virtual void SendNoteOn(uint8_t Key, uint8_t Velocity, int32_t FragmentPos) = 0;
66 schoenebeck 889 virtual void SendNoteOff(uint8_t Key, uint8_t Velocity) = 0;
67 schoenebeck 906 virtual void SendNoteOff(uint8_t Key, uint8_t Velocity, int32_t FragmentPos) = 0;
68 schoenebeck 889 virtual void SendPitchbend(int Pitch) = 0;
69 schoenebeck 906 virtual void SendPitchbend(int Pitch, int32_t FragmentPos) = 0;
70 schoenebeck 889 virtual void SendControlChange(uint8_t Controller, uint8_t Value) = 0;
71 schoenebeck 906 virtual void SendControlChange(uint8_t Controller, uint8_t Value, int32_t FragmentPos) = 0;
72 persson 1924 virtual void SendProgramChange(uint8_t Program) = 0;
73 schoenebeck 889 virtual bool StatusChanged(bool bNewStatus = false) = 0;
74     virtual float Volume() = 0;
75     virtual void Volume(float f) = 0;
76 schoenebeck 1723 virtual float Pan() = 0;
77     virtual void Pan(float f) = 0;
78 schoenebeck 889 virtual uint Channels() = 0;
79     virtual void Connect(AudioOutputDevice* pAudioOut) = 0;
80     virtual void DisconnectAudioOutputDevice() = 0;
81 schoenebeck 1001 virtual AudioOutputDevice* GetAudioOutputDevice() = 0;
82 schoenebeck 889 virtual void SetOutputChannel(uint EngineAudioChannel, uint AudioDeviceChannel) = 0;
83     virtual int OutputChannel(uint EngineAudioChannel) = 0;
84     virtual void Connect(MidiInputPort* pMidiPort, midi_chan_t MidiChannel) = 0;
85     virtual void DisconnectMidiInputPort() = 0;
86     virtual MidiInputPort* GetMidiInputPort() = 0;
87     virtual midi_chan_t MidiChannel() = 0;
88     virtual String InstrumentFileName() = 0;
89     virtual String InstrumentName() = 0;
90     virtual int InstrumentIndex() = 0;
91     virtual int InstrumentStatus() = 0;
92     virtual Engine* GetEngine() = 0;
93     virtual String EngineName() = 0;
94 schoenebeck 1001 virtual FxSend* AddFxSend(uint8_t MidiCtrl, String Name = "") throw (Exception) = 0;
95     virtual FxSend* GetFxSend(uint FxSendIndex) = 0;
96     virtual uint GetFxSendCount() = 0;
97     virtual void RemoveFxSend(FxSend* pFxSend) = 0;
98 schoenebeck 1686 virtual void Connect(VirtualMidiDevice* pDevice) = 0;
99     virtual void Disconnect(VirtualMidiDevice* pDevice) = 0;
100 schoenebeck 889
101 schoenebeck 1001
102     /////////////////////////////////////////////////////////////////
103     // normal methods
104     // (usually not to be overridden by descendant)
105    
106 schoenebeck 889 /**
107     * Sets the mute state of this channel.
108     *
109     * @param state - specifies the mute state of this sampler channel.
110     * @throws Exception - if state does not contain valid
111     * value.
112     */
113     void SetMute(int state) throw (Exception);
114    
115     /**
116     * Determines whether this channel is muted.
117     *
118     * @returns 1 if the channel is muted, 0 if the channel is not muted
119     * and -1 if the channel is muted because of presence of at least
120     * one solo channel.
121     */
122     int GetMute();
123    
124     /**
125     * Sets the solo state of this channel.
126     *
127     * @param solo - specifies whether this is a solo channel.
128     */
129     void SetSolo(bool solo);
130    
131     /**
132     * Determines whether this is a solo channel.
133     *
134     * @returns true if this is a solo channel, false otherwise.
135     */
136     bool GetSolo();
137    
138 schoenebeck 947 /**
139     * Returns current MIDI program (change) number of this
140     * EngineChannel.
141     */
142     uint8_t GetMidiProgram();
143    
144     /**
145     * Change EngineChannel's MIDI program.
146     */
147     void SetMidiProgram(uint8_t Program);
148    
149     /**
150     * Returns current MIDI bank MSB (coarse) number of this
151     * EngineChannel.
152     */
153     uint8_t GetMidiBankMsb();
154    
155     /**
156     * Change current MIDI bank MSB (coarse) number of this
157     * EngineChannel.
158     */
159     void SetMidiBankMsb(uint8_t BankMSB);
160    
161     /**
162     * Returns current MIDI bank LSB (fine) number of this
163     * EngineChannel.
164     */
165     uint8_t GetMidiBankLsb();
166    
167     /**
168     * Change current MIDI bank LSB (fine) number of this
169     * EngineChannel.
170     */
171     void SetMidiBankLsb(uint8_t BankLSB);
172    
173 schoenebeck 973 /**
174     * Returns true if this EngineChannel is using no MIDI
175     * instrument map at all, that is if it will ignore all MIDI
176     * program change messages.
177     *
178     * @see UsesDefaultMidiInstrumentMap()
179     * @see GetMidiInstrumentMap()
180     */
181     bool UsesNoMidiInstrumentMap();
182    
183     /**
184     * Returns true if this EngineChannel is using the default MIDI
185     * instrument map for handling MIDI program changes.
186     *
187     * @see UsesNoMidiInstrumentMap()
188     * @see GetMidiInstrumentMap()
189     */
190     bool UsesDefaultMidiInstrumentMap();
191    
192     /**
193     * Returns ID of the MIDI instrument map currently used by this
194     * EngineChannel to handle MIDI program changes. You should
195     * always call @c UsesNoMidiInstrumentMap() and
196     * @c UsesDefaultMidiInstrumentMap() before calling this method
197     * to check if this EngineChannel is probably using the default
198     * map or no map at all, because in these two particular cases
199     * this method would throw an exception!
200     *
201     * @throws Exception - if EngineChannel is set to no map at all
202     * or is set to the default map
203     * @see UsesNoMidiInstrumentMap()
204     * @see UsesDefaultMidiInstrumentMap()
205     */
206     int GetMidiInstrumentMap() throw (Exception);
207    
208     /**
209     * Let this EngineChannel use no MIDI instrument map at all,
210     * that is to let it ignore all MIDI program change messages.
211     *
212     * @see SetMidiInstrumentMapToDefault()
213     * @see SetMidiInstrumentMap()
214     */
215     void SetMidiInstrumentMapToNone();
216    
217     /**
218     * Let this EngineChannel use the default MIDI instrument map to
219     * handle MIDI program changes.
220     *
221     * @see SetMidiInstrumentMapToNone()
222     * @see SetMidiInstrumentMap()
223     */
224     void SetMidiInstrumentMapToDefault();
225    
226     /**
227     * Set a specific MIDI instrument map this EngineChannel should
228     * use to handle MIDI program changes.
229     *
230     * @see SetMidiInstrumentMapToNone()
231     * @see SetMidiInstrumentMapToDefault()
232     *
233     * @throws Exception - in case given map does not exist
234     */
235     void SetMidiInstrumentMap(int MidiMap) throw (Exception);
236    
237 schoenebeck 1041 /**
238     * Set MIDI Registered Parameter Number (RPN) Controller
239     * (upper 8 bits / coarse).
240     */
241     void SetMidiRpnControllerMsb(uint8_t CtrlMSB);
242    
243     /**
244     * Set MIDI Registered Parameter Number (RPN) Controller
245     * (lower 8 bits / fine).
246     */
247     void SetMidiRpnControllerLsb(uint8_t CtrlLSB);
248    
249     /**
250 schoenebeck 1044 * Reset to no RPN controller currently selected.
251     */
252     void ResetMidiRpnController();
253 schoenebeck 1879
254 schoenebeck 2121 /**
255     * Set MIDI Non-Registered Parameter Number (NRPN) Controller
256     * (upper 8 bits / coarse).
257     */
258     void SetMidiNrpnControllerMsb(uint8_t CtrlMSB);
259    
260     /**
261     * Set MIDI Non-Registered Parameter Number (NRPN) Controller
262     * (lower 8 bits / fine).
263     */
264     void SetMidiNrpnControllerLsb(uint8_t CtrlLSB);
265    
266     /**
267     * Reset to no NRPN controller currently selected.
268     */
269     void ResetMidiNrpnController();
270    
271 iliev 1130 /**
272     * Registers the specified listener to be notified when the number
273     * of effect sends on this channel is changed.
274     */
275     void AddFxSendCountListener(FxSendCountListener* l);
276 schoenebeck 1044
277     /**
278 iliev 1130 * Removes the specified listener.
279     */
280     void RemoveFxSendCountListener(FxSendCountListener* l);
281    
282     /**
283     * Removes all listeners.
284     */
285     void RemoveAllFxSendCountListeners();
286    
287     /**
288 schoenebeck 1041 * Get currently selected MIDI Registered Parameter Number
289     * (RPN) Controller, this method will return the already merged
290     * value (MSB and LSB value).
291 schoenebeck 1044 *
292     * @e WARNING: you have to call @c ResetMidiRpnController()
293     * after using this value, otherwise all subsequent MIDI CC #6
294     * (Data) messages are interpreted as RPN controller value
295     * messages.
296     *
297     * @returns currently selected RPN controller number, a negative
298     * value if no RPN controller currently selected
299 schoenebeck 1041 */
300     int GetMidiRpnController();
301    
302 iliev 1297 /**
303 schoenebeck 2121 * Get currently selected MIDI Non-Registered Parameter Number
304     * (NRPN) Controller, this method will return the already merged
305     * value (MSB and LSB value).
306     *
307     * @e WARNING: you have to call @c ResetMidiNrpnController()
308     * after using this value, otherwise all subsequent MIDI CC #6
309     * (Data) messages are interpreted as NRPN controller value
310     * messages.
311     *
312     * @returns currently selected NRPN controller number, a negative
313     * value if no NRPN controller currently selected
314     */
315     int GetMidiNrpnController();
316    
317     /**
318 iliev 1297 * Gets the current number of active voices.
319     */
320     uint GetVoiceCount();
321    
322     /**
323     * Sets the current number of active voices.
324     */
325     void SetVoiceCount(uint Voices);
326    
327     /**
328     * Gets the current number of active disk streams.
329     */
330     uint GetDiskStreamCount();
331    
332     /**
333     * Sets the current number of active disk streams.
334     */
335     void SetDiskStreamCount(uint Streams);
336    
337 iliev 1761 SamplerChannel* GetSamplerChannel();
338 schoenebeck 1879
339 iliev 1761 void SetSamplerChannel(SamplerChannel* pChannel);
340 schoenebeck 889
341 iliev 1761 /** Returns the sampler to which this channel belongs */
342     Sampler* GetSampler();
343    
344 persson 1924 /**
345     * Performs a program change on the channel.
346     *
347     * This method is not real-time safe.
348     */
349     void ExecuteProgramChange(uint8_t Program);
350    
351 schoenebeck 889 protected:
352 schoenebeck 906 EngineChannel();
353 schoenebeck 1879 virtual ~EngineChannel(); // MUST only be destroyed by EngineChannelFactory
354 iliev 1130
355     /**
356     * Notifies listeners that the number of effect sends
357     * on a this channel is changed.
358     * @param ChannelId The numerical ID of the sampler channel.
359     * @param NewCount The new number of sampler channels.
360     */
361     void fireFxSendCountChanged(int ChannelId, int NewCount);
362    
363 schoenebeck 889 friend class EngineChannelFactory;
364    
365     private:
366 persson 1896 struct private_data_t;
367     private_data_t* const p;
368 schoenebeck 889 };
369    
370     } // namespace LinuxSampler
371    
372     #endif // __LS_ENGINECHANNEL_H__

  ViewVC Help
Powered by ViewVC