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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2121 - (show 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 /***************************************************************************
2 * *
3 * Copyright (C) 2005 - 2010 Christian Schoenebeck *
4 * *
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 #include "../EventListeners.h"
25 #include "../drivers/audio/AudioOutputDevice.h"
26 #include "../drivers/midi/midi.h"
27 #include "../drivers/midi/MidiInputDevice.h"
28 #include "../drivers/midi/MidiInputPort.h"
29 #include "../drivers/midi/VirtualMidiDevice.h"
30 #include "Engine.h"
31 #include "FxSend.h"
32
33 namespace LinuxSampler {
34
35 // just symbol prototyping
36 class Sampler;
37 class SamplerChannel;
38 class AudioOutputDevice;
39 class MidiInputPort;
40 class FxSend;
41
42
43 /** @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 virtual void SendNoteOn(uint8_t Key, uint8_t Velocity, int32_t FragmentPos) = 0;
66 virtual void SendNoteOff(uint8_t Key, uint8_t Velocity) = 0;
67 virtual void SendNoteOff(uint8_t Key, uint8_t Velocity, int32_t FragmentPos) = 0;
68 virtual void SendPitchbend(int Pitch) = 0;
69 virtual void SendPitchbend(int Pitch, int32_t FragmentPos) = 0;
70 virtual void SendControlChange(uint8_t Controller, uint8_t Value) = 0;
71 virtual void SendControlChange(uint8_t Controller, uint8_t Value, int32_t FragmentPos) = 0;
72 virtual void SendProgramChange(uint8_t Program) = 0;
73 virtual bool StatusChanged(bool bNewStatus = false) = 0;
74 virtual float Volume() = 0;
75 virtual void Volume(float f) = 0;
76 virtual float Pan() = 0;
77 virtual void Pan(float f) = 0;
78 virtual uint Channels() = 0;
79 virtual void Connect(AudioOutputDevice* pAudioOut) = 0;
80 virtual void DisconnectAudioOutputDevice() = 0;
81 virtual AudioOutputDevice* GetAudioOutputDevice() = 0;
82 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 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 virtual void Connect(VirtualMidiDevice* pDevice) = 0;
99 virtual void Disconnect(VirtualMidiDevice* pDevice) = 0;
100
101
102 /////////////////////////////////////////////////////////////////
103 // normal methods
104 // (usually not to be overridden by descendant)
105
106 /**
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 /**
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 /**
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 /**
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 * Reset to no RPN controller currently selected.
251 */
252 void ResetMidiRpnController();
253
254 /**
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 /**
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
277 /**
278 * Removes the specified listener.
279 */
280 void RemoveFxSendCountListener(FxSendCountListener* l);
281
282 /**
283 * Removes all listeners.
284 */
285 void RemoveAllFxSendCountListeners();
286
287 /**
288 * Get currently selected MIDI Registered Parameter Number
289 * (RPN) Controller, this method will return the already merged
290 * value (MSB and LSB value).
291 *
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 */
300 int GetMidiRpnController();
301
302 /**
303 * 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 * 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 SamplerChannel* GetSamplerChannel();
338
339 void SetSamplerChannel(SamplerChannel* pChannel);
340
341 /** Returns the sampler to which this channel belongs */
342 Sampler* GetSampler();
343
344 /**
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 protected:
352 EngineChannel();
353 virtual ~EngineChannel(); // MUST only be destroyed by EngineChannelFactory
354
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 friend class EngineChannelFactory;
364
365 private:
366 struct private_data_t;
367 private_data_t* const p;
368 };
369
370 } // namespace LinuxSampler
371
372 #endif // __LS_ENGINECHANNEL_H__

  ViewVC Help
Powered by ViewVC