138c7401eSmahlzeit
2173d0cd7Smahlzeit#ifndef _MIDI_STORE_H
3173d0cd7Smahlzeit#define _MIDI_STORE_H
4173d0cd7Smahlzeit
5173d0cd7Smahlzeit#include <BeBuild.h>
652a38012Sejakowatz#include <Midi.h>
7b178e190Smahlzeit#include <MidiSynthFile.h>
852a38012Sejakowatz
952a38012Sejakowatzstruct entry_ref;
10173d0cd7Smahlzeit
1125767509Smahlzeitclass BFile;
1238c7401eSmahlzeitclass BList;
1338c7401eSmahlzeitclass BMidiEvent;
1452a38012Sejakowatz
15c34e5f4dSStefano Ceccheriniclass BMidiStore : public BMidi {
16eac71506Sjerlpublic:
17173d0cd7Smahlzeit
1838c7401eSmahlzeit	BMidiStore();
1938c7401eSmahlzeit	virtual ~BMidiStore();
20173d0cd7Smahlzeit
2138c7401eSmahlzeit	virtual void NoteOff(
2238c7401eSmahlzeit		uchar channel, uchar note, uchar velocity, uint32 time = B_NOW);
2352a38012Sejakowatz
2438c7401eSmahlzeit	virtual void NoteOn(
2538c7401eSmahlzeit		uchar channel, uchar note, uchar velocity, uint32 time = B_NOW);
26173d0cd7Smahlzeit
2738c7401eSmahlzeit	virtual void KeyPressure(
2838c7401eSmahlzeit		uchar channel, uchar note, uchar pressure, uint32 time = B_NOW);
29173d0cd7Smahlzeit
3038c7401eSmahlzeit	virtual void ControlChange(
3138c7401eSmahlzeit		uchar channel, uchar controlNumber, uchar controlValue,
3238c7401eSmahlzeit		uint32 time = B_NOW);
33173d0cd7Smahlzeit
3438c7401eSmahlzeit	virtual void ProgramChange(
3538c7401eSmahlzeit		uchar channel, uchar programNumber, uint32 time = B_NOW);
36173d0cd7Smahlzeit
3738c7401eSmahlzeit	virtual void ChannelPressure(
3838c7401eSmahlzeit		uchar channel, uchar pressure, uint32 time = B_NOW);
39173d0cd7Smahlzeit
4038c7401eSmahlzeit	virtual void PitchBend(
4138c7401eSmahlzeit		uchar channel, uchar lsb, uchar msb, uint32 time = B_NOW);
42173d0cd7Smahlzeit
4338c7401eSmahlzeit	virtual void SystemExclusive(
4438c7401eSmahlzeit		void* data, size_t length, uint32 time = B_NOW);
45173d0cd7Smahlzeit
4638c7401eSmahlzeit	virtual void SystemCommon(
4738c7401eSmahlzeit		uchar status, uchar data1, uchar data2, uint32 time = B_NOW);
48173d0cd7Smahlzeit
4938c7401eSmahlzeit	virtual void SystemRealTime(uchar status, uint32 time = B_NOW);
5052a38012Sejakowatz
5138c7401eSmahlzeit	virtual void TempoChange(int32 beatsPerMinute, uint32 time = B_NOW);
52173d0cd7Smahlzeit
5338c7401eSmahlzeit	status_t Import(const entry_ref* ref);
5438c7401eSmahlzeit	status_t Export(const entry_ref* ref, int32 format);
55173d0cd7Smahlzeit
5638c7401eSmahlzeit	void SortEvents(bool force = false);
5738c7401eSmahlzeit	uint32 CountEvents() const;
58173d0cd7Smahlzeit
5938c7401eSmahlzeit	uint32 CurrentEvent() const;
6038c7401eSmahlzeit	void SetCurrentEvent(uint32 eventNumber);
61173d0cd7Smahlzeit
6238c7401eSmahlzeit	uint32 DeltaOfEvent(uint32 eventNumber) const;
6338c7401eSmahlzeit	uint32 EventAtDelta(uint32 time) const;
6452a38012Sejakowatz
6538c7401eSmahlzeit	uint32 BeginTime() const;
66eac71506Sjerl
6738c7401eSmahlzeit	void SetTempo(int32 beatsPerMinute);
6838c7401eSmahlzeit	int32 Tempo() const;
6952a38012Sejakowatz
7038c7401eSmahlzeitprivate:
71173d0cd7Smahlzeit
72b178e190Smahlzeit	friend class BMidiSynthFile;
73b178e190Smahlzeit
7438c7401eSmahlzeit	virtual void _ReservedMidiStore1();
7538c7401eSmahlzeit	virtual void _ReservedMidiStore2();
7638c7401eSmahlzeit	virtual void _ReservedMidiStore3();
7738c7401eSmahlzeit
7838c7401eSmahlzeit	virtual void Run();
7938c7401eSmahlzeit
8038c7401eSmahlzeit	void AddEvent(BMidiEvent* event);
8138c7401eSmahlzeit	void SprayEvent(const BMidiEvent* event, uint32 time);
8238c7401eSmahlzeit	BMidiEvent* EventAt(int32 index) const;
8338c7401eSmahlzeit	uint32 GetEventTime(const BMidiEvent* event) const;
8438c7401eSmahlzeit	uint32 TicksToMilliseconds(uint32 ticks) const;
8538c7401eSmahlzeit	uint32 MillisecondsToTicks(uint32 ms) const;
8638c7401eSmahlzeit
874810cdcdSJérôme Duval	BList* fEvents;
884810cdcdSJérôme Duval	int32 fCurrentEvent;
894810cdcdSJérôme Duval	uint32 fStartTime;
904810cdcdSJérôme Duval	int32 fBeatsPerMinute;
914810cdcdSJérôme Duval	int16 fTicksPerBeat;
924810cdcdSJérôme Duval	bool fNeedsSorting;
9338c7401eSmahlzeit
9438c7401eSmahlzeit	void ReadFourCC(char* fourcc);
9538c7401eSmahlzeit	uint32 Read32Bit();
9638c7401eSmahlzeit	uint16 Read16Bit();
9738c7401eSmahlzeit	uint8 PeekByte();
9838c7401eSmahlzeit	uint8 NextByte();
9938c7401eSmahlzeit	void SkipBytes(uint32 length);
10038c7401eSmahlzeit	uint32 ReadVarLength();
10138c7401eSmahlzeit	void ReadChunk();
10238c7401eSmahlzeit	void ReadTrack();
10338c7401eSmahlzeit	void ReadSystemExclusive();
10438c7401eSmahlzeit	void ReadMetaEvent();
10538c7401eSmahlzeit
10638c7401eSmahlzeit	void WriteFourCC(char a, char b, char c, char d);
10738c7401eSmahlzeit	void Write32Bit(uint32 val);
10838c7401eSmahlzeit	void Write16Bit(uint16 val);
10938c7401eSmahlzeit	void WriteByte(uint8 val);
11038c7401eSmahlzeit	void WriteVarLength(uint32 val);
11138c7401eSmahlzeit	void WriteTrack();
11238c7401eSmahlzeit	void WriteMetaEvent(BMidiEvent* event);
11338c7401eSmahlzeit
1144810cdcdSJérôme Duval	BFile* fFile;
1154810cdcdSJérôme Duval	uint32 fByteCount;
1164810cdcdSJérôme Duval	uint32 fTotalTicks;
1174810cdcdSJérôme Duval	uint16 fNumTracks;
1184810cdcdSJérôme Duval	uint16 fCurrTrack;
1194810cdcdSJérôme Duval	uint16 fFormat;
12038c7401eSmahlzeit
12138c7401eSmahlzeit	uint16 _reserved1[1];
122b178e190Smahlzeit
1234810cdcdSJérôme Duval	bool* fInstruments;
1244810cdcdSJérôme Duval	synth_file_hook fHookFunc;
1254810cdcdSJérôme Duval	int32 fHookArg;
1264810cdcdSJérôme Duval	bool fLooping;
1274810cdcdSJérôme Duval	bool fPaused;
1284810cdcdSJérôme Duval	bool fFinished;
129b178e190Smahlzeit
130f9b2179cSmahlzeit	uint32 _reserved2[12];
13138c7401eSmahlzeit};
132eac71506Sjerl
13338c7401eSmahlzeit#endif // _MIDI_STORE_H
134