From f221d365d8d3943a82070004ce63406f564d7f32 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Thu, 8 Aug 2002 16:19:57 +0000 Subject: [PATCH] SynthFile git-svn-id: file:///srv/svn/repos/haiku/trunk/current@653 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kits/midi/synth_file_reader/SynthFile.cpp | 186 ++++++++++++++++++ .../kits/midi/synth_file_reader/SynthFile.h | 131 ++++++++++++ 2 files changed, 317 insertions(+) create mode 100644 src/tests/kits/midi/synth_file_reader/SynthFile.cpp create mode 100644 src/tests/kits/midi/synth_file_reader/SynthFile.h diff --git a/src/tests/kits/midi/synth_file_reader/SynthFile.cpp b/src/tests/kits/midi/synth_file_reader/SynthFile.cpp new file mode 100644 index 0000000000..6bea601254 --- /dev/null +++ b/src/tests/kits/midi/synth_file_reader/SynthFile.cpp @@ -0,0 +1,186 @@ +/* + +SynthFile.cpp + +Copyright (c) 2002 OpenBeOS. + +Author: + Michael Pfeiffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#include + +#include "SynthFile.h" +#include "SynthFileReader.h" + +// SSound + +SSound::SSound(uint16 id) + : fOffset(0) + , fId(id) + , fSamples(NULL) + , fFrameCount(0) + , fSampleSize(0) + , fChannelCount(0) +{ +} + + +void +SSound::SetSample(void* samples, int32 frameCount, int16 sampleSize, int16 channelCount) +{ + ASSERT(fSamples == NULL); + fSamples = samples; + fFrameCount = frameCount; + fSampleSize = sampleSize; + fChannelCount = channelCount; +} + +// SSoundInRange +SSoundInRange::SSoundInRange(uint8 start, uint8 end, SSound* sound) + : fNoteStart(start) + , fNoteEnd(end) + , fSound(sound) +{ +} + + +// SInstrument + +SInstrument::SInstrument(uint8 instrument) + : fOffset(0) + , fId(instrument) + , fDefaultSound(NULL) + , fSounds(false) // does not own items +{ +} + + +// SSynthFile + +static int bySoundId(const SSound** a, const SSound** b) +{ + return (*a)->Id() - (*b)->Id(); +} + +SSynthFile::SSynthFile(const char* fileName) + : fReader(fileName) +{ + fStatus = fReader.InitCheck(); + if (fStatus == B_OK) { + for (int i = 0; i < 128; i++) { + fInstruments.AddItem(NULL); + } + + fStatus = fReader.Initialize(this); + fSounds.SortItems(bySoundId); + } +} + +SSound* +SSynthFile::FindSound(uint16 sound) +{ + const int n = fSounds.CountItems(); + for (int i = 0; i < n; i ++) { + SSound* s = fSounds.ItemAt(i); + if (s->Id() == sound) return s; + } + return NULL; +} + +SSound* +SSynthFile::GetSound(uint16 sound) +{ + SSound* s = FindSound(sound); + if (s == NULL) { + s = new SSound(sound); + fSounds.AddItem(s); + } + return s; +} + + +void +SSynthFile::InstrumentAtPut(int i, SInstrument* instr) +{ + ASSERT(fInstruments.CountItems() == 128); + SInstrument** array = (SInstrument**)fInstruments.Items(); + array[i] = instr; +} + + +bool +SSynthFile::HasInstrument(uint8 instrument) const +{ + ASSERT(instrument < 128); + return fInstruments.ItemAt(instrument) != NULL; +} + +SInstrument* +SSynthFile::GetInstrument(uint8 instrument) +{ + ASSERT(instrument < 128); + SInstrument* i = fInstruments.ItemAt(instrument); + if (i == NULL) { + i = new SInstrument(instrument); + InstrumentAtPut(instrument, i); + } + return i; +} + +void +SSynthFile::Dump() +{ + printf("SynthFile:\n"); + printf("==========\n\n"); + for (uint8 i = 0; i < 128; i++) { + if (HasInstrument(i)) { + SInstrument* instr = GetInstrument(i); + printf("Instrument id=%d name=%s sounds=%d\n", + (int)instr->Id(), + instr->Name(), + (int)instr->Sounds()->CountItems()); + SSound* sound = instr->DefaultSound(); + ASSERT(sound != NULL); + printf("Default Sound id=%d name='%s'\n", + (int)sound->Id(), + sound->Name()); + for (int s = 0; s < instr->Sounds()->CountItems(); s ++) { + SSoundInRange* range = instr->Sounds()->ItemAt(s); + printf("Sound id=%d start=%d end=%d name='%s'\n", + (int)range->Sound()->Id(), + (int)range->Start(), + (int)range->End(), + range->Sound()->Name()); + } + printf("\n"); + } + } + + printf("\nSounds:\n"); + printf("-------\n\n"); + for (int i = 0; i < fSounds.CountItems(); i ++) { + SSound* sound = fSounds.ItemAt(i); + printf("Id=%d name='%s'\n", (int)sound->Id(), sound->Name()); + } +} + diff --git a/src/tests/kits/midi/synth_file_reader/SynthFile.h b/src/tests/kits/midi/synth_file_reader/SynthFile.h new file mode 100644 index 0000000000..74b468dd57 --- /dev/null +++ b/src/tests/kits/midi/synth_file_reader/SynthFile.h @@ -0,0 +1,131 @@ +/* + +SynthFile.h + +Copyright (c) 2002 OpenBeOS. + +Author: + Michael Pfeiffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#ifndef _SYNTH_FILE_H +#define _SYNTH_FILE_H + +#include "SynthFileReader.h" +#include "TList.h" + + +class SSound { + uint32 fOffset; + uint16 fId; + BString fName; + void* fSamples; + int32 fFrameCount; + int16 fSampleSize; + int16 fChannelCount; + + SSound() { } +public: + SSound(uint16 id); + + uint16 Id() const { return fId; } + + void SetName(const char* name) { fName = name; } + const char* Name() const { return fName.String(); } + + void SetSample(void* samples, int32 frameCount, int16 sampleSize, int16 channelCount); + void* Samples() const { return fSamples; } + int32 FrameCount() const { return fFrameCount; } + int16 SampleSize() const { return fSampleSize; } + int16 ChannelCount() const { return fChannelCount; } + + bool HasSamples() const { return fSamples != NULL; } + + void SetOffset(uint32 offset) { fOffset = offset; } + uint32 Offset() const { return fOffset; } +}; + + +class SSoundInRange { + uint8 fNoteStart; + uint8 fNoteEnd; + SSound* fSound; + + SSoundInRange() { } +public: + SSoundInRange(uint8 start, uint8 end, SSound* sound); + + uint8 Start() const { return fNoteStart; } + uint8 End() const { return fNoteEnd; } + SSound* Sound() const { return fSound; } +}; + + +class SInstrument { + uint32 fOffset; + uint8 fId; + BString fName; + SSound* fDefaultSound; + TList fSounds; + +public: + SInstrument(uint8 instrument); + + void SetOffset(uint32 offset) { fOffset = offset; } + uint32 Offset() const { return fOffset; } + + uint8 Id() const { return fId; } + + void SetName(const char* name) { fName = name; } + const char* Name() const { return fName.String(); } + + void SetDefaultSound(SSound* sound) { fDefaultSound = sound; } + SSound* DefaultSound() const { return fDefaultSound; } + + TList* Sounds() { return &fSounds; } +}; + + +class SSynthFile; + +class SSynthFile { + TList fInstruments; + TList fSounds; + SSynthFileReader fReader; + status_t fStatus; + + void InstrumentAtPut(int i, SInstrument* instr); + SSound* FindSound(uint16 sound); + +public: + SSynthFile(const char* fileName); + status_t InitCheck() const { return fReader.InitCheck(); } + + + SSound* GetSound(uint16 sound); + bool HasInstrument(uint8 instrument) const; + SInstrument* GetInstrument(uint8 instrument); + + void Dump(); +}; + +#endif