; If set to 1, timing information is generated during music generation ; which is needed for Clinkster_GetInstrumentTrigger. ; Set it to 0 if you don't need this functionality. %define CLINKSTER_GENERATE_TIMING_DATA 1 ; Offset applied by Clinkster_GetPosition to compensate for graphics latency. ; Measured in samples (44100ths of a second). ; The default value of 2048 (corresponding to about 46 milliseconds) is ; appropriate for typical display latencies for high-framerate effects. %define CLINKSTER_TIMER_OFFSET 2048 %include "music-win.asm" ;; ********** Definitions ********** global Clinkster_GenerateMusic global _Clinkster_GenerateMusic@0 global Clinkster_StartMusic global _Clinkster_StartMusic@0 global Clinkster_GetPosition global _Clinkster_GetPosition@0 global Clinkster_GetInstrumentTrigger global _Clinkster_GetInstrumentTrigger@8 global Clinkster_MusicBuffer global _Clinkster_MusicBuffer global Clinkster_TicksPerSecond global _Clinkster_TicksPerSecond global Clinkster_MusicLength global _Clinkster_MusicLength global Clinkster_NumTracks global _Clinkster_NumTracks %if CLINKSTER_GENERATE_TIMING_DATA global Clinkster_NoteTiming global _Clinkster_NoteTiming %endif global Clinkster_WavFileHeader global _Clinkster_WavFileHeader extern __imp__waveOutOpen@24 extern __imp__waveOutPrepareHeader@12 extern __imp__waveOutWrite@12 extern __imp__waveOutGetPosition@12 %define SAMPLE_RATE 44100 %define WAVE_SIZE 65536 ;; ********** Public variables ********** section MusBuf bss align=4 Clinkster_MusicBuffer: _Clinkster_MusicBuffer: .align24 resw (TOTAL_SAMPLES*2) section tps rdata align=4 Clinkster_TicksPerSecond: _Clinkster_TicksPerSecond: dd TICKS_PER_SECOND section muslen rdata align=4 Clinkster_MusicLength: _Clinkster_MusicLength: dd MUSIC_LENGTH section numtr rdata align=4 Clinkster_NumTracks: _Clinkster_NumTracks: dd NUMTRACKS %if CLINKSTER_GENERATE_TIMING_DATA section musdat bss align=4 Clinkster_NoteTiming: _Clinkster_NoteTiming: .align16 resd 2*(NUMTRACKS<0 fiadd dword [c_timeoffset] %endif fidiv dword [c_ticklength] ret ;; ********** Get time since instrument trigger ********** %if CLINKSTER_GENERATE_TIMING_DATA section insttrig text align=1 Clinkster_GetInstrumentTrigger: _Clinkster_GetInstrumentTrigger@8: cvttss2si eax, [esp+8] mov ecx, [esp+4] shl ecx, LOGNUMTICKS+2 fld dword [esp+8] fisub dword [Clinkster_NoteTiming+ecx+eax*4] ret 8 %endif