/* Copyright (c) 2021 Alex Diener This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Alex Diener alex@ludobloom.com */ #ifndef __MusicSequence_H__ #define __MusicSequence_H__ #ifdef __cplusplus extern "C" { #endif typedef struct MusicSequence MusicSequence; #define MusicSequence_superclass StemObject #include "audiosynth/AudioSequence.h" #include "audiosynth/MusicInstrument.h" #include "audiosynth/MusicPattern.h" #include "serialization/DeserializationContext.h" #include "serialization/SerializationContext.h" #include "stemobject/StemObject.h" #define MusicSequence_formatVersion 2 #define MusicSequence_formatType "music" #define MusicSequence_patternCountMax 1024 #define MusicSequence_patternInstanceCountMax 65536 #define MusicSequence_instrumentCountMax 128 #define MusicSequence_trackCountMax 128 typedef struct MusicSequence_patternInstance { unsigned int measureOffset; unsigned int trackIndex; unsigned int patternIndex; unsigned int repeatCount; } MusicSequence_patternInstance; typedef struct MusicSequence_instrument { unsigned int instrumentID; char * name; MusicInstrument * instrument; } MusicSequence_instrument; typedef struct MusicSequence_track { bool mute; bool solo; bool invert; float amplitude; float pan; } MusicSequence_track; #define MusicSequence_track_default ((MusicSequence_track) {false, false, false, 1.0f, 0.0f}) #define MusicSequence_ivars \ StemObject_ivars \ \ float beatsPerMinute; \ unsigned int defaultMeterSize; \ unsigned int defaultMeterBasicNote; \ unsigned int patternCount; \ MusicPattern ** patterns; \ unsigned int patternInstanceCount; \ MusicSequence_patternInstance * patternInstances; \ unsigned int instrumentCount; \ MusicSequence_instrument * instruments; \ unsigned int trackCount; \ MusicSequence_track * tracks; #define MusicSequence_vtable(self_type) \ StemObject_vtable(self_type) stemobject_declare(MusicSequence) MusicSequence * MusicSequence_create(float beatsPerMinute, unsigned int defaultMeterSize, unsigned int defaultMeterBasicNote); bool MusicSequence_init(MusicSequence * self, float beatsPerMinute, unsigned int defaultMeterSize, unsigned int defaultMeterBasicNote); void MusicSequence_dispose(MusicSequence * self); MusicSequence * MusicSequence_copy(MusicSequence * self); void MusicSequence_initCopy(MusicSequence * self, MusicSequence * original); // Takes ownership of pattern unsigned int MusicSequence_addPattern(MusicSequence * self, MusicPattern * pattern); void MusicSequence_deletePattern(MusicSequence * self, unsigned int patternIndex); void MusicSequence_addPatternInstance(MusicSequence * self, unsigned int measureOffset, unsigned int trackIndex, unsigned int patternIndex, unsigned int repeatCount); void MusicSequence_deletePatternInstance(MusicSequence * self, unsigned int patternInstanceIndex); // Takes ownership of instrument void MusicSequence_setInstrument(MusicSequence * self, unsigned int instrumentID, const char * name, compat_type(MusicInstrument *) instrument); void MusicSequence_removeInstrument(MusicSequence * self, unsigned int instrumentID); MusicInstrument * MusicSequence_getInstrumentWithID(MusicSequence * self, unsigned int instrumentID); MusicSequence_track MusicSequence_getTrackParameters(MusicSequence * self, unsigned int trackIndex); void MusicSequence_setTrackParameters(MusicSequence * self, unsigned int trackIndex, MusicSequence_track trackParameters); AudioSequence * MusicSequence_createAudioSequence(MusicSequence * self); AudioSequence * MusicSequence_createAudioSequenceForPattern(MusicSequence * self, MusicPattern * pattern); double MusicSequence_getLoopDuration(MusicSequence * self); MusicSequence * MusicSequence_deserialize(compat_type(DeserializationContext *) deserializationContext); MusicSequence * MusicSequence_deserializeMinimal(compat_type(DeserializationContext *) deserializationContext, uint16_t formatVersion); bool MusicSequence_initFromSerializedData(MusicSequence * self, compat_type(DeserializationContext *) deserializationContext); bool MusicSequence_initFromSerializedDataMinimal(MusicSequence * self, compat_type(DeserializationContext *) deserializationContext, uint16_t formatVersion); void MusicSequence_serialize(MusicSequence * self, compat_type(SerializationContext *) serializationContext); void MusicSequence_serializeMinimal(MusicSequence * self, compat_type(SerializationContext *) serializationContext); #ifdef __cplusplus } #endif #endif