xref: /haiku/src/kits/midi/MidiSynthFile.cpp (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
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 "debug.h"
15 #include <MidiStore.h>
16 #include <MidiSynthFile.h>
17 #include "SoftSynth.h"
18 
19 using namespace BPrivate;
20 
21 
22 BMidiSynthFile::BMidiSynthFile()
23 {
24 	fStore = new BMidiStore();
25 }
26 
27 
28 BMidiSynthFile::~BMidiSynthFile()
29 {
30 	Stop();
31 	delete fStore;
32 }
33 
34 
35 status_t
36 BMidiSynthFile::LoadFile(const entry_ref* midi_entry_ref)
37 {
38 	if (midi_entry_ref == NULL)
39 		return B_BAD_VALUE;
40 
41 	EnableInput(true, false);
42 	fStore->fFinished = true;
43 
44 	status_t err = fStore->Import(midi_entry_ref);
45 
46 	if (err == B_OK) {
47 		for (int t = 0; t < 128; ++t) {
48 			if (fStore->fInstruments[t]) {
49 				be_synth->fSynth->LoadInstrument(t);
50 			}
51 		}
52 	}
53 
54 	return err;
55 }
56 
57 
58 void
59 BMidiSynthFile::UnloadFile(void)
60 {
61 	delete fStore;
62 	fStore = new BMidiStore();
63 }
64 
65 
66 status_t
67 BMidiSynthFile::Start(void)
68 {
69 	fStore->Connect(this);
70 	fStore->SetCurrentEvent(0);
71 	return fStore->Start();
72 }
73 
74 
75 void
76 BMidiSynthFile::Stop(void)
77 {
78 	fStore->Stop();
79 	fStore->Disconnect(this);
80 }
81 
82 
83 void
84 BMidiSynthFile::Fade(void)
85 {
86 	Stop();  // really quick fade :P
87 }
88 
89 
90 void
91 BMidiSynthFile::Pause(void)
92 {
93 	fStore->fPaused = true;
94 }
95 
96 
97 void
98 BMidiSynthFile::Resume(void)
99 {
100 	fStore->fPaused = false;
101 }
102 
103 
104 int32
105 BMidiSynthFile::Duration(void) const
106 {
107 	return fStore->DeltaOfEvent(fStore->CountEvents());
108 }
109 
110 
111 int32
112 BMidiSynthFile::Position(int32 ticks) const
113 {
114 	return fStore->EventAtDelta(ticks);
115 }
116 
117 
118 int32
119 BMidiSynthFile::Seek()
120 {
121 	return fStore->CurrentEvent();
122 }
123 
124 
125 status_t
126 BMidiSynthFile::GetPatches(
127 	int16* pArray768, int16* pReturnedCount) const
128 {
129 	int16 count = 0;
130 
131 	for (int t = 0; t < 128; ++t) {
132 		if (fStore->fInstruments[t]) {
133 			pArray768[count++] = t;
134 		}
135 	}
136 
137 	*pReturnedCount = count;
138 	return B_OK;
139 }
140 
141 
142 void
143 BMidiSynthFile::SetFileHook(synth_file_hook pSongHook, int32 arg)
144 {
145 	fStore->fHookFunc = pSongHook;
146 	fStore->fHookArg = arg;
147 }
148 
149 
150 bool
151 BMidiSynthFile::IsFinished() const
152 {
153 	return fStore->fFinished;
154 }
155 
156 
157 void
158 BMidiSynthFile::ScaleTempoBy(double tempoFactor)
159 {
160 	fStore->SetTempo((int32) (Tempo() * tempoFactor));
161 }
162 
163 
164 void
165 BMidiSynthFile::SetTempo(int32 newTempoBPM)
166 {
167 	fStore->SetTempo(newTempoBPM);
168 }
169 
170 
171 int32
172 BMidiSynthFile::Tempo(void) const
173 {
174 	return fStore->Tempo();
175 }
176 
177 
178 void
179 BMidiSynthFile::EnableLooping(bool loop)
180 {
181 	fStore->fLooping = loop;
182 }
183 
184 
185 void
186 BMidiSynthFile::MuteTrack(int16 track, bool do_mute)
187 {
188 	fprintf(stderr, "[midi] MuteTrack is broken; don't use it\n");
189 }
190 
191 
192 void
193 BMidiSynthFile::GetMuteMap(char* pTracks) const
194 {
195 	fprintf(stderr, "[midi] GetMuteMap is broken; don't use it\n");
196 }
197 
198 
199 void
200 BMidiSynthFile::SoloTrack(int16 track, bool do_solo)
201 {
202 	fprintf(stderr, "[midi] SoloTrack is broken; don't use it\n");
203 }
204 
205 
206 void
207 BMidiSynthFile::GetSoloMap(char* pTracks) const
208 {
209 	fprintf(stderr, "[midi] GetSoloMap is broken; don't use it\n");
210 }
211 
212 
213 void BMidiSynthFile::_ReservedMidiSynthFile1() { }
214 void BMidiSynthFile::_ReservedMidiSynthFile2() { }
215 void BMidiSynthFile::_ReservedMidiSynthFile3() { }
216 
217