1 /*
2 * Copyright 2006, Haiku.
3 *
4 * Copyright (c) 2002-2004 Matthijs Hollemans
5 * Copyright (c) 2003 Jerome Leveque
6 * Distributed under the terms of the MIT License.
7 *
8 * Authors:
9 *
10 * Matthijs Hollemans
11 * Jérôme Leveque
12 */
13
14 #include <MidiSynth.h>
15
16 #include "debug.h"
17 #include "SoftSynth.h"
18
19 using namespace BPrivate;
20
21
BMidiSynth()22 BMidiSynth::BMidiSynth()
23 {
24 if (be_synth == NULL) {
25 new BSynth();
26 }
27
28 be_synth->fClientCount++;
29
30 fInputEnabled = false;
31 fTranspose = 0;
32 fCreationTime = system_time();
33 }
34
35
~BMidiSynth()36 BMidiSynth::~BMidiSynth()
37 {
38 be_synth->fClientCount--;
39 if (be_synth->fClientCount == 0) {
40 delete be_synth;
41 be_synth = NULL;
42 }
43 }
44
45
46 status_t
EnableInput(bool enable,bool loadInstruments)47 BMidiSynth::EnableInput(bool enable, bool loadInstruments)
48 {
49 status_t err = B_OK;
50 fInputEnabled = enable;
51
52 if (loadInstruments) {
53 err = be_synth->fSynth->LoadAllInstruments();
54 }
55
56 return err;
57 }
58
59
60 bool
IsInputEnabled() const61 BMidiSynth::IsInputEnabled() const
62 {
63 return fInputEnabled;
64 }
65
66
67 void
SetVolume(double volume)68 BMidiSynth::SetVolume(double volume)
69 {
70 be_synth->fSynth->SetVolume(volume);
71 }
72
73
74 double
Volume() const75 BMidiSynth::Volume() const
76 {
77 return be_synth->fSynth->Volume();
78 }
79
80
81 void
SetTransposition(int16 offset)82 BMidiSynth::SetTransposition(int16 offset)
83 {
84 fTranspose = offset;
85 }
86
87
88 int16
Transposition() const89 BMidiSynth::Transposition() const
90 {
91 return fTranspose;
92 }
93
94
95 void
MuteChannel(int16 channel,bool do_mute)96 BMidiSynth::MuteChannel(int16 channel, bool do_mute)
97 {
98 fprintf(stderr, "[midi] MuteChannel is broken; don't use it\n");
99 }
100
101
102 void
GetMuteMap(char * pChannels) const103 BMidiSynth::GetMuteMap(char* pChannels) const
104 {
105 fprintf(stderr, "[midi] GetMuteMap is broken; don't use it\n");
106 }
107
108
109 void
SoloChannel(int16 channel,bool do_solo)110 BMidiSynth::SoloChannel(int16 channel, bool do_solo)
111 {
112 fprintf(stderr, "[midi] SoloChannel is broken; don't use it\n");
113 }
114
115
116 void
GetSoloMap(char * pChannels) const117 BMidiSynth::GetSoloMap(char* pChannels) const
118 {
119 fprintf(stderr, "[midi] GetSoloMap is broken; don't use it\n");
120 }
121
122
123 status_t
LoadInstrument(int16 instrument)124 BMidiSynth::LoadInstrument(int16 instrument)
125 {
126 return be_synth->fSynth->LoadInstrument(instrument);
127 }
128
129
130 status_t
UnloadInstrument(int16 instrument)131 BMidiSynth::UnloadInstrument(int16 instrument)
132 {
133 return be_synth->fSynth->UnloadInstrument(instrument);
134 }
135
136
137 status_t
RemapInstrument(int16 from,int16 to)138 BMidiSynth::RemapInstrument(int16 from, int16 to)
139 {
140 return be_synth->fSynth->RemapInstrument(from, to);
141 }
142
143
144 void
FlushInstrumentCache(bool startStopCache)145 BMidiSynth::FlushInstrumentCache(bool startStopCache)
146 {
147 be_synth->fSynth->FlushInstrumentCache(startStopCache);
148 }
149
150
151 uint32
Tick() const152 BMidiSynth::Tick() const
153 {
154 return (uint32) (system_time() - fCreationTime);
155 }
156
157
158 void
NoteOff(uchar channel,uchar note,uchar velocity,uint32 time)159 BMidiSynth::NoteOff(
160 uchar channel, uchar note, uchar velocity, uint32 time)
161 {
162 if (fInputEnabled)
163 be_synth->fSynth->NoteOff(channel, note + fTranspose, velocity, time);
164 }
165
166
167 void
NoteOn(uchar channel,uchar note,uchar velocity,uint32 time)168 BMidiSynth::NoteOn(
169 uchar channel, uchar note, uchar velocity, uint32 time)
170 {
171 if (fInputEnabled)
172 be_synth->fSynth->NoteOn(channel, note + fTranspose, velocity, time);
173 }
174
175
176 void
KeyPressure(uchar channel,uchar note,uchar pressure,uint32 time)177 BMidiSynth::KeyPressure(
178 uchar channel, uchar note, uchar pressure, uint32 time)
179 {
180 if (fInputEnabled)
181 be_synth->fSynth->KeyPressure(
182 channel, note + fTranspose, pressure, time);
183 }
184
185
186 void
ControlChange(uchar channel,uchar controlNumber,uchar controlValue,uint32 time)187 BMidiSynth::ControlChange(
188 uchar channel, uchar controlNumber, uchar controlValue, uint32 time)
189 {
190 if (fInputEnabled)
191 be_synth->fSynth->ControlChange(
192 channel, controlNumber, controlValue, time);
193 }
194
195
196 void
ProgramChange(uchar channel,uchar programNumber,uint32 time)197 BMidiSynth::ProgramChange(
198 uchar channel, uchar programNumber, uint32 time)
199 {
200 if (fInputEnabled)
201 be_synth->fSynth->ProgramChange(channel, programNumber, time);
202 }
203
204
205 void
ChannelPressure(uchar channel,uchar pressure,uint32 time)206 BMidiSynth::ChannelPressure(uchar channel, uchar pressure, uint32 time)
207 {
208 if (fInputEnabled)
209 be_synth->fSynth->ChannelPressure(channel, pressure, time);
210 }
211
212
213 void
PitchBend(uchar channel,uchar lsb,uchar msb,uint32 time)214 BMidiSynth::PitchBend(uchar channel, uchar lsb, uchar msb, uint32 time)
215 {
216 if (fInputEnabled)
217 be_synth->fSynth->PitchBend(channel, lsb, msb, time);
218 }
219
220
221 void
AllNotesOff(bool justChannel,uint32 time)222 BMidiSynth::AllNotesOff(bool justChannel, uint32 time)
223 {
224 if (fInputEnabled)
225 be_synth->fSynth->AllNotesOff(justChannel, time);
226 }
227
228
_ReservedMidiSynth1()229 void BMidiSynth::_ReservedMidiSynth1() { }
_ReservedMidiSynth2()230 void BMidiSynth::_ReservedMidiSynth2() { }
_ReservedMidiSynth3()231 void BMidiSynth::_ReservedMidiSynth3() { }
_ReservedMidiSynth4()232 void BMidiSynth::_ReservedMidiSynth4() { }
233
234
235 void
Run()236 BMidiSynth::Run()
237 {
238 // do nothing
239 }
240
241