forked from KolibriOS/kolibrios
Added libraries/ufmod source code.
git-svn-id: svn://kolibrios.org@1845 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
32e469b81f
commit
d21a6e85e7
142
programs/develop/libraries/ufmod/Fasm/frmwrk.asm
Normal file
142
programs/develop/libraries/ufmod/Fasm/frmwrk.asm
Normal file
@ -0,0 +1,142 @@
|
||||
; FRMWRK.ASM
|
||||
; ----------
|
||||
; A set of common GUI code used in uFMOD examples for KolibriOS.
|
||||
; Feel free to reuse it in your own projects if you like it ;)
|
||||
|
||||
; ---------------------------------------------------------------
|
||||
; void _cdecl _MessageBox (szCap, lpString, cbString);
|
||||
; void _cdecl _MessageBoxCB(szCap, lpString, cbString, cbProc);
|
||||
; ---------------------------------------------------------------
|
||||
|
||||
; This is similar to a Win32 MessageBox. The box is centered
|
||||
; on screen. It contains a single-line text message and an
|
||||
; "OK" button. This function returns when user closes the
|
||||
; box (via the X button or via the OK button). An optional
|
||||
; callback subroutine may be specified to be called when no
|
||||
; events are pending in the event queue.
|
||||
|
||||
; NOTE: Doesn't work if you already have defined a window
|
||||
; in the current process! Doesn't modify the event mask. So,
|
||||
; make sure keyboard events are enabled before calling this
|
||||
; function. This function doesn't check the validity of the
|
||||
; supplied parameters!
|
||||
|
||||
; Parameters:
|
||||
; szCap - A pointer to the ASCIIz string containing the
|
||||
; caption. A trailing zero char IS required.
|
||||
; lpString - A pointer to an ASCII string containing a single
|
||||
; line message to pop up in the box. No trailing
|
||||
; zero char is required.
|
||||
; cbString - number of characters in string.
|
||||
; cbProc - Address of the callback subroutine. Can be NULL.
|
||||
|
||||
sOK db "OK"
|
||||
if FRMWRK_CALLBACK_ON
|
||||
_MessageBoxCB:
|
||||
else
|
||||
_MessageBox:
|
||||
end if
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
push ebx
|
||||
xor ebp,ebp ; global 0
|
||||
mov esi,[esp+28] ; cbString
|
||||
mov edi,[esp+20] ; szCap
|
||||
|
||||
; Get screen metrics.
|
||||
lea eax,[ebp+14]
|
||||
int 40h
|
||||
mov ecx,eax
|
||||
movzx eax,ax
|
||||
shr ecx,16 ; screen w
|
||||
xchg eax,edx ; screen h
|
||||
lea ebx,[esi*2+esi]
|
||||
lea ebx,[ebx*2+28] ; w = string len * 6 + 28
|
||||
sub ecx,ebx
|
||||
shr ecx,1
|
||||
shl ecx,16
|
||||
or ebx,ecx
|
||||
lea ecx,[ebp+52h] ; h = 52h
|
||||
sub edx,ecx
|
||||
shr edx,1
|
||||
shl edx,16
|
||||
or ecx,edx ; y = (screen h - window h) / 2
|
||||
mov edx,ebx ; x = (screen w - window w) / 2
|
||||
|
||||
_MessageBoxCB_redraw:
|
||||
; Start redraw.
|
||||
push edx
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+1]
|
||||
int 40h
|
||||
|
||||
; Define and draw window.
|
||||
xor eax,eax
|
||||
mov ebx,edx ; x, w (ECX: y, h)
|
||||
mov edx,34C0C0C0h ; style and BG color
|
||||
int 40h
|
||||
|
||||
; Define the OK button.
|
||||
push esi
|
||||
lea eax,[ebp+8]
|
||||
sub ebx,28+0Ah
|
||||
shr bx,1
|
||||
shl ebx,16 ; x = (window w - button w) / 2
|
||||
mov bx,18+0Ah ; w = 18 + 0Ah
|
||||
mov ecx,001C0012h ; y = 1Ch, h = 12h
|
||||
lea edx,[ebp+1] ; ID = close
|
||||
mov esi,0C0C0C0h ; color
|
||||
int 40h
|
||||
|
||||
; Draw the OK label.
|
||||
lea eax,[ebp+4]
|
||||
add ebx,90000h ; x = button x + 9
|
||||
mov bx,22h ; y = 22h
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,sOK ; string
|
||||
lea esi,[ebp+2] ; length
|
||||
int 40h
|
||||
pop esi
|
||||
|
||||
; Draw text string.
|
||||
lea eax,[ebp+4]
|
||||
mov ebx,000A000Ah ; x = 0Ah, y = 0Ah
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,[esp+28] ; lpString
|
||||
int 40h
|
||||
|
||||
; End redraw.
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+2]
|
||||
int 40h
|
||||
|
||||
if FRMWRK_CALLBACK_ON
|
||||
_MessageBoxCB_eventloop:
|
||||
mov edx,[esp+36] ; cbProc
|
||||
test edx,edx
|
||||
lea eax,[ebp+10]
|
||||
jz _MessageBoxCB_peekevent
|
||||
|
||||
; Invoke the callback.
|
||||
call edx
|
||||
|
||||
lea eax,[ebp+23]
|
||||
lea ebx,[ebp+10] ; wait for at most 0.1 sec
|
||||
_MessageBoxCB_peekevent:
|
||||
int 40h
|
||||
dec eax
|
||||
js _MessageBoxCB_eventloop
|
||||
else
|
||||
lea eax,[ebp+10]
|
||||
int 40h
|
||||
dec eax
|
||||
end if
|
||||
pop edx
|
||||
jz _MessageBoxCB_redraw
|
||||
|
||||
pop ebx
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
ret
|
239
programs/develop/libraries/ufmod/Fasm/jmp2pat.asm
Normal file
239
programs/develop/libraries/ufmod/Fasm/jmp2pat.asm
Normal file
@ -0,0 +1,239 @@
|
||||
; JMP2PAT.ASM
|
||||
; -----------
|
||||
; Sometimes it makes sense merging various XM tracks
|
||||
; sharing the same instruments in a single XM file.
|
||||
; This example program uses such an XM file actually
|
||||
; containing 3 tracks and the _uFMOD_Jump2Pattern
|
||||
; function to play all 3 tracks in the same file.
|
||||
|
||||
; A precompiled version (not packed or whatever) is
|
||||
; available in bin\
|
||||
|
||||
use32
|
||||
org 0
|
||||
db 'MENUET01'
|
||||
dd 1
|
||||
dd START ; Entry point
|
||||
dd uFMOD_IMG_END ; End of code and initialized data
|
||||
dd MEMORY_END ; End of uninitialized (BSS) data
|
||||
dd STACK_B ; Bottom of the stack
|
||||
dd 0 ; Args
|
||||
dd 0 ; Reserved
|
||||
|
||||
; uFMOD setup:
|
||||
UF_FREQ equ 48000 ; Set sampling rate to 48KHz (22050, 44100, 48000)
|
||||
UF_RAMP equ STRONG ; Select STRONG interpolation (NONE, WEAK, STRONG)
|
||||
UD_MODE equ UNSAFE ; Select UNSAFE mode (NORMAL, UNSAFE)
|
||||
DEBUG equ 0 ; Skip debug-board messages
|
||||
NOLINKER equ 1 ; Select "no linker" mode
|
||||
|
||||
; uFMOD constants:
|
||||
XM_MEMORY = 1
|
||||
XM_FILE = 2
|
||||
XM_NOLOOP = 8
|
||||
XM_SUSPENDED = 16
|
||||
uFMOD_MIN_VOL = 0
|
||||
uFMOD_MAX_VOL = 25
|
||||
uFMOD_DEFAULT_VOL = 25
|
||||
|
||||
; BLITZXMK.XM tracked by Kim (aka norki):
|
||||
; [00:07] - track #1
|
||||
; [08:10] - track #2
|
||||
; [11:13] - track #3
|
||||
xm file '..\ufmodlib\media\BLITZXMK.XM'
|
||||
xm_length = $ - xm
|
||||
|
||||
; Optimization:
|
||||
; This header file is suitable for blitzxmk.xm track only!
|
||||
; If you change the track, update the optimization header.
|
||||
; (Use the standart eff.inc file for a general purpose player app.)
|
||||
include '..\ufmodlib\media\blitz.eff.inc'
|
||||
|
||||
; Include the GUI framework.
|
||||
FRMWRK_CALLBACK_ON equ 0 ; Disable callback
|
||||
include 'frmwrk.asm'
|
||||
|
||||
; UI text messages.
|
||||
vals dd 0,8,11 ; Preset pattern indexes
|
||||
wnd_btns1 db "1 2 3 Pause "
|
||||
wnd_btns2 db "1 2 3 Resume"
|
||||
wnd_btns_l = $ - wnd_btns2
|
||||
wnd_cap db "Jump2Pattern",0
|
||||
err_txt db "Error"
|
||||
err_txt_l = $ - err_txt
|
||||
err_cap db ":-(",0
|
||||
|
||||
START:
|
||||
; Start playback.
|
||||
push XM_MEMORY
|
||||
push xm_length
|
||||
push xm
|
||||
call _uFMOD_LoadSong
|
||||
|
||||
; Stack fixing is required here, but in this simple
|
||||
; example leaving ESP as it is won't harm. In a real
|
||||
; application you should uncomment the following line:
|
||||
; add esp,12
|
||||
|
||||
test eax,eax
|
||||
jz error
|
||||
xor ebp,ebp ; global 0
|
||||
mov [wnd_btns],wnd_btns1
|
||||
|
||||
; Switch keyboard mode to SCANCODE.
|
||||
lea ebx,[ebp+1]
|
||||
lea eax,[ebp+66]
|
||||
mov ecx,ebx
|
||||
int 40h
|
||||
|
||||
; Get screen metrics.
|
||||
lea eax,[ebp+14]
|
||||
int 40h
|
||||
mov ecx,eax
|
||||
movzx eax,ax
|
||||
shr ecx,16 ; screen w
|
||||
xchg eax,edx ; screen h
|
||||
mov ebx,wnd_btns_l*6+42
|
||||
sub ecx,ebx
|
||||
shr ecx,1
|
||||
shl ecx,16
|
||||
or ebx,ecx
|
||||
lea ecx,[ebp+40h] ; h = 40h
|
||||
sub edx,ecx
|
||||
shr edx,1
|
||||
shl edx,16
|
||||
or ecx,edx ; y = (screen h - window h) / 2
|
||||
mov edx,ebx ; x = (screen w - window w) / 2
|
||||
|
||||
redraw:
|
||||
; Start redraw.
|
||||
push edx
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+1]
|
||||
int 40h
|
||||
|
||||
; Define and draw window.
|
||||
xor eax,eax
|
||||
mov ebx,edx ; x, w (ECX: y, h)
|
||||
mov edx,34C0C0C0h ; style and BG color
|
||||
mov edi,wnd_cap
|
||||
int 40h
|
||||
|
||||
; Define the 1 2 3 Pause/Resume buttons.
|
||||
lea eax,[ebp+8]
|
||||
mov ebx,0A0012h ; x = 0Ah, w = 12h
|
||||
mov ecx,0A0012h ; y = 0Ah, h = 10h
|
||||
lea edx,[ebp+10] ; ID = #10
|
||||
mov esi,0C0C0C0h ; color
|
||||
int 40h
|
||||
mov ebx,280012h ; x = 28h, w = 12h
|
||||
inc edx ; ID = #11
|
||||
int 40h
|
||||
mov ebx,460012h ; x = 46h, w = 12h
|
||||
inc edx ; ID = #12
|
||||
int 40h
|
||||
mov ebx,640030h ; x = 64h, w = 30h
|
||||
inc edx ; ID = #13
|
||||
int 40h
|
||||
|
||||
; Draw the labels.
|
||||
lea eax,[ebp+4]
|
||||
mov ebx,120011h ; x = 12h, y = 11h
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,[wnd_btns] ; string
|
||||
lea esi,[ebp+wnd_btns_l] ; length
|
||||
int 40h
|
||||
|
||||
; End redraw.
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+2]
|
||||
int 40h
|
||||
|
||||
eventloop:
|
||||
; Update the PCM buffer.
|
||||
call _uFMOD_WaveOut
|
||||
|
||||
lea eax,[ebp+23]
|
||||
lea ebx,[ebp+10] ; wait for at most 0.1 sec
|
||||
int 40h
|
||||
dec eax
|
||||
js eventloop ; 0 = idle
|
||||
jz redraw ; 1 = redraw
|
||||
|
||||
dec eax ; 2 = keyboard event
|
||||
jnz chk_eventbutton
|
||||
|
||||
; Get key scancode.
|
||||
lea eax,[ebp+2]
|
||||
int 40h
|
||||
cmp ah,19h ; P
|
||||
je do_PauseResume
|
||||
cmp ah,13h ; R
|
||||
je do_PauseResume
|
||||
chk_kb123:
|
||||
movzx eax,ah
|
||||
sub eax,2
|
||||
jmp do_Jump2Pat123
|
||||
|
||||
chk_eventbutton: ; 3 = button event
|
||||
lea eax,[ebp+17]
|
||||
int 40h
|
||||
cmp ah,1 ; Close
|
||||
je break_loop
|
||||
cmp ah,13 ; Pause/Resume
|
||||
jne chk_btn123
|
||||
|
||||
do_PauseResume:
|
||||
cmp BYTE [paused],1
|
||||
mov edx,_uFMOD_Resume
|
||||
mov ebx,wnd_btns1
|
||||
je do_Resume
|
||||
mov edx,_uFMOD_Pause
|
||||
mov ebx,wnd_btns2
|
||||
do_Resume:
|
||||
call edx
|
||||
xor BYTE [paused],1
|
||||
mov [wnd_btns],ebx
|
||||
jmp redraw
|
||||
|
||||
chk_btn123: ; 1 2 3
|
||||
movzx eax,ah
|
||||
sub eax,10
|
||||
|
||||
do_Jump2Pat123:
|
||||
cmp eax,3
|
||||
jae eventloop
|
||||
push DWORD [vals+eax*4]
|
||||
call _uFMOD_Jump2Pattern
|
||||
pop eax ; fix stack
|
||||
jmp eventloop
|
||||
break_loop:
|
||||
|
||||
; Stop playback.
|
||||
call _uFMOD_StopSong
|
||||
|
||||
r: ; Exit.
|
||||
xor eax,eax
|
||||
dec eax
|
||||
int 40h
|
||||
|
||||
error:
|
||||
push err_txt_l ; cbString
|
||||
push err_txt ; lpString
|
||||
push err_cap ; szCap
|
||||
call _MessageBox
|
||||
; add esp,16
|
||||
jmp r
|
||||
|
||||
; Include the whole uFMOD sources here. (Right after
|
||||
; your main code to avoid naming conflicts, but still
|
||||
; inside your code section.)
|
||||
macro PUBLIC symbol {} ; hide all publics
|
||||
include '..\ufmodlib\src\fasm.asm'
|
||||
|
||||
wnd_btns dd ?
|
||||
paused db ?
|
||||
align 4
|
||||
rb 1020
|
||||
STACK_B dd ? ; Stack bottom
|
||||
MEMORY_END: ; End of uninitialized (BSS) data
|
20
programs/develop/libraries/ufmod/Fasm/make.bat
Normal file
20
programs/develop/libraries/ufmod/Fasm/make.bat
Normal file
@ -0,0 +1,20 @@
|
||||
@echo off
|
||||
rem Make the uFMOD examples.
|
||||
rem Compiler: FASM
|
||||
rem Target OS: KolibriOS
|
||||
|
||||
rem FASM Path:
|
||||
SET UF_FASM=\fasm
|
||||
|
||||
if not exist "%UF_FASM%\fasm.exe" goto Err1
|
||||
"%UF_FASM%\fasm" mini.asm mini
|
||||
"%UF_FASM%\fasm" jmp2pat.asm jmp2pat
|
||||
goto TheEnd
|
||||
|
||||
:Err1
|
||||
echo Couldn't find fasm.exe in %UF_FASM%\
|
||||
|
||||
:TheEnd
|
||||
pause
|
||||
@echo on
|
||||
cls
|
109
programs/develop/libraries/ufmod/Fasm/mini.asm
Normal file
109
programs/develop/libraries/ufmod/Fasm/mini.asm
Normal file
@ -0,0 +1,109 @@
|
||||
; MINI.ASM
|
||||
; --------
|
||||
; Minimalistic uFMOD usage example.
|
||||
|
||||
; Shows how to play an XM track in memory,
|
||||
; including proper error handling.
|
||||
|
||||
; A precompiled version (not packed or whatever) is
|
||||
; available in bin\
|
||||
|
||||
use32
|
||||
org 0
|
||||
db 'MENUET01'
|
||||
dd 1
|
||||
dd START ; Entry point
|
||||
dd uFMOD_IMG_END ; End of code and initialized data
|
||||
dd MEMORY_END ; End of uninitialized (BSS) data
|
||||
dd STACK_B ; Bottom of the stack
|
||||
dd 0 ; Args
|
||||
dd 0 ; Reserved
|
||||
|
||||
; uFMOD setup:
|
||||
UF_FREQ equ 48000 ; Set sampling rate to 48KHz (22050, 44100, 48000)
|
||||
UF_RAMP equ STRONG ; Select STRONG interpolation (NONE, WEAK, STRONG)
|
||||
UD_MODE equ UNSAFE ; Select UNSAFE mode (NORMAL, UNSAFE)
|
||||
DEBUG equ 0 ; Skip debug-board messages
|
||||
NOLINKER equ 1 ; Select "no linker" mode
|
||||
|
||||
; uFMOD constants:
|
||||
XM_MEMORY = 1
|
||||
XM_FILE = 2
|
||||
XM_NOLOOP = 8
|
||||
XM_SUSPENDED = 16
|
||||
uFMOD_MIN_VOL = 0
|
||||
uFMOD_MAX_VOL = 25
|
||||
uFMOD_DEFAULT_VOL = 25
|
||||
|
||||
; The XM track.
|
||||
xm file '..\ufmodlib\media\mini.xm'
|
||||
xm_length = $ - xm
|
||||
|
||||
; Optimization:
|
||||
; This header file is suitable for mini.xm track only!
|
||||
; If you change the track, update the optimization header.
|
||||
; (Use the standart eff.inc file for a general purpose player app.)
|
||||
include '..\ufmodlib\media\mini.eff.inc'
|
||||
|
||||
; Include the GUI framework.
|
||||
FRMWRK_CALLBACK_ON equ 1 ; Enable callback
|
||||
include 'frmwrk.asm'
|
||||
|
||||
; UI text messages.
|
||||
msg_txt db "uFMOD ruleZ!"
|
||||
msg_txt_l = $ - msg_txt
|
||||
msg_cap db "FASM",0
|
||||
err_txt db "Error"
|
||||
err_txt_l = $ - err_txt
|
||||
err_cap db ":-(",0
|
||||
|
||||
START:
|
||||
; Start playback.
|
||||
push XM_MEMORY
|
||||
push xm_length
|
||||
push xm
|
||||
call _uFMOD_LoadSong
|
||||
|
||||
; Stack fixing is required here, but in this simple
|
||||
; example leaving ESP as it is won't harm. In a real
|
||||
; application you should uncomment the following line:
|
||||
; add esp,12
|
||||
|
||||
test eax,eax
|
||||
jz error
|
||||
|
||||
; Wait for user input.
|
||||
push _uFMOD_WaveOut ; cbProc <- continue fetching data!
|
||||
push msg_txt_l ; cbString
|
||||
push msg_txt ; lpString
|
||||
push msg_cap ; szCap
|
||||
call _MessageBoxCB
|
||||
; add esp,16
|
||||
|
||||
; Stop playback.
|
||||
call _uFMOD_StopSong
|
||||
|
||||
r: ; Exit.
|
||||
xor eax,eax
|
||||
dec eax
|
||||
int 40h
|
||||
|
||||
error:
|
||||
push 0 ; cbProc <- no callback
|
||||
push err_txt_l ; cbString
|
||||
push err_txt ; lpString
|
||||
push err_cap ; szCap
|
||||
call _MessageBoxCB
|
||||
; add esp,16
|
||||
jmp r
|
||||
|
||||
; Include the whole uFMOD sources here. (Right after
|
||||
; your main code to avoid naming conflicts, but still
|
||||
; inside your code section.)
|
||||
macro PUBLIC symbol {} ; hide all publics
|
||||
include '..\ufmodlib\src\fasm.asm'
|
||||
|
||||
align 4
|
||||
rb 1020
|
||||
STACK_B dd ? ; Stack bottom
|
||||
MEMORY_END: ; End of uninitialized (BSS) data
|
35
programs/develop/libraries/ufmod/Masm32/make.bat
Normal file
35
programs/develop/libraries/ufmod/Masm32/make.bat
Normal file
@ -0,0 +1,35 @@
|
||||
@echo off
|
||||
rem Set compiler location:
|
||||
SET MASM32=\masm32
|
||||
SET UF_FASM=\fasm
|
||||
|
||||
if not exist "%MASM32%\bin\ml.exe" goto Err1
|
||||
if not exist "%UF_FASM%\fasm.exe" goto Err2
|
||||
"%MASM32%\bin\ml" /c /coff mini.asm
|
||||
"%MASM32%\bin\link" /DRIVER /SUBSYSTEM:NATIVE /BASE:-0x10000 /ALIGN:0x10000 /MERGE:.data=.text -ignore:4078 mini.obj ufmod.obj
|
||||
del mini.obj
|
||||
echo virtual at 0 >tmp.asm
|
||||
echo file 'mini.exe':3Ch,4 >>tmp.asm
|
||||
echo load pehea dword from 0 >>tmp.asm
|
||||
echo file 'mini.exe':pehea+0F8h,28h >>tmp.asm
|
||||
echo load physofs dword from 4+14h >>tmp.asm
|
||||
echo load mem dword from 4+8 >>tmp.asm
|
||||
echo file 'mini.exe':physofs+16,4 >>tmp.asm
|
||||
echo load sz dword from $-4 >>tmp.asm
|
||||
echo end virtual >>tmp.asm
|
||||
echo file 'mini.exe':physofs,sz >>tmp.asm
|
||||
echo store dword mem at 14h >>tmp.asm
|
||||
"%UF_FASM%\fasm" tmp.asm mini
|
||||
del mini.exe
|
||||
del tmp.asm
|
||||
|
||||
goto TheEnd
|
||||
:Err1
|
||||
echo Couldn't find ml.exe in %MASM32%\bin
|
||||
goto TheEnd
|
||||
:Err2
|
||||
echo Couldn't find fasm.exe in %UF_FASM%\
|
||||
|
||||
:TheEnd
|
||||
pause
|
||||
cls
|
266
programs/develop/libraries/ufmod/Masm32/mini.asm
Normal file
266
programs/develop/libraries/ufmod/Masm32/mini.asm
Normal file
@ -0,0 +1,266 @@
|
||||
; MINI.ASM
|
||||
; --------
|
||||
; Shows how to place data and code inside (!!!) the XM track.
|
||||
|
||||
.386
|
||||
.model flat
|
||||
|
||||
include ufmod.inc ; uFMOD API
|
||||
|
||||
.CODE
|
||||
|
||||
PE_BASE db "MENUET01"
|
||||
dd 1
|
||||
dd OFFSET _START ; Entry point
|
||||
dd OFFSET BSS_START ; End of code and initialized data
|
||||
dd OFFSET BSS_END ; End of uninitialized (BSS) data
|
||||
dd OFFSET STACK_B ; Bottom of the stack
|
||||
dd 0 ; Args
|
||||
dd 0 ; Reserved
|
||||
|
||||
err_txt db "Error"
|
||||
err_txt_l EQU $ - err_txt
|
||||
|
||||
_START:
|
||||
; Start playback.
|
||||
push XM_MEMORY
|
||||
push xm_length
|
||||
push BYTE PTR xm
|
||||
|
||||
; Let's place the stream right inside the code section.
|
||||
xm_length EQU 905
|
||||
xm EQU $ - PE_BASE
|
||||
xm_unused_000 LABEL BYTE
|
||||
|
||||
; *** The following 60 bytes are not used. So, we'll place
|
||||
; *** some code here.
|
||||
; (the actual size and location of such gaps may be
|
||||
; found out using the Eff utility)
|
||||
|
||||
call uFMOD_LoadSong
|
||||
xor ebp,ebp ; global 0
|
||||
|
||||
; Stack fixing is required here, but in this simple
|
||||
; example leaving ESP as it is won't harm. In a real
|
||||
; application you should uncomment the following line:
|
||||
; add esp,12
|
||||
|
||||
test eax,eax
|
||||
jz error
|
||||
|
||||
; Wait for user input.
|
||||
push uFMOD_WaveOut ; cbProc <- continue fetching data!
|
||||
push BYTE PTR msg_txt_l ; cbString
|
||||
push OFFSET msg_txt ; lpString
|
||||
push OFFSET msg_cap ; szCap
|
||||
call MessageBoxCB
|
||||
; add esp,16
|
||||
|
||||
; Stop playback.
|
||||
call uFMOD_StopSong
|
||||
|
||||
r: ; Exit.
|
||||
lea eax,[ebp-1]
|
||||
int 40h
|
||||
|
||||
error:
|
||||
push ebp ; cbProc <- no callback
|
||||
push BYTE PTR err_txt_l ; cbString
|
||||
push BYTE PTR (err_txt - PE_BASE) ; lpString
|
||||
push OFFSET err_cap ; szCap
|
||||
call MessageBoxCB
|
||||
; add esp,16
|
||||
jmp r
|
||||
|
||||
org xm_unused_000 + 60
|
||||
db 034h,000h,000h,000h,020h,000h,000h,000h,002h,000h,00Dh,000h,001h,000h,001h,000h
|
||||
db 00Ah,000h,091h,000h,000h,001h,002h,003h,004h,005h,006h,007h,000h,001h,002h,003h
|
||||
db 004h,005h,006h,007h,008h,009h,00Ah,00Bh,008h,009h,00Ch,00Bh,008h,009h,00Ah,00Bh
|
||||
db 008h,009h,00Ch,00Bh,009h,000h,000h,000h,000h,004h,000h,001h,000h,083h,016h,001h
|
||||
db 080h,080h,02Eh,001h,000h,00Eh,060h,080h,03Ah,001h,000h,00Eh,062h,081h,061h,083h
|
||||
db 035h,001h,009h,000h,000h,000h,000h,004h,000h,001h,000h,083h,016h,001h,080h,080h
|
||||
db 02Eh,001h,000h,00Eh,060h,080h,035h,001h,000h,00Eh,062h,081h,061h,083h,038h,001h
|
||||
db 009h,000h,000h,000h,000h,004h,000h,001h,000h,083h,016h,001h,080h,080h,02Eh,001h
|
||||
db 000h,00Eh,060h,080h,038h,001h,000h,00Eh,062h,080h,083h,033h,001h,009h,000h,000h
|
||||
db 000h,000h,006h,000h,001h,000h,083h,016h,001h,080h,080h,02Eh,001h,000h,00Eh,060h
|
||||
db 080h,033h,001h,000h,00Eh,061h,081h,061h,083h,035h,001h,083h,00Dh,001h,083h,036h
|
||||
db 001h,080h,083h,036h,001h,009h,000h,000h,000h,000h,004h,000h,001h,000h,083h,00Fh
|
||||
db 001h,080h,080h,02Eh,001h,000h,00Eh,060h,080h,036h,001h,000h,00Eh,062h,081h,061h
|
||||
db 083h,033h,001h,009h,000h,000h,000h,000h,006h,000h,001h,000h,083h,00Fh,001h,080h
|
||||
db 080h,02Eh,001h,000h,00Eh,060h,080h,033h,001h,000h,00Eh,061h,081h,061h,083h,02Eh
|
||||
db 001h,083h,012h,001h,083h,033h,001h,080h,083h,035h,001h,009h,000h,000h,000h,000h
|
||||
db 006h,000h,001h,000h,083h,016h,001h,080h,080h,02Eh,001h,000h,00Eh,060h,080h,035h
|
||||
db 001h,000h,00Eh,061h,081h,061h,083h,02Eh,001h,083h,00Dh,001h,083h,031h,001h,080h
|
||||
db 083h,02Eh,001h,009h,000h,000h,000h,000h,008h,000h,001h,000h,083h,012h,001h,098h
|
||||
db 00Ah,001h,083h,019h,001h,088h,00Ah,083h,01Eh,001h,081h,061h,083h,012h,001h,080h
|
||||
db 083h,014h,001h,080h,083h,01Bh,001h,080h,083h,020h,001h,080h,083h,014h,001h,080h
|
||||
db 009h,000h,000h,000h,000h,008h,000h,001h,000h,083h,012h,001h,081h,061h,083h,019h
|
||||
db 001h,080h,083h,01Eh,001h,080h,083h,012h,001h,080h,083h,019h,001h,083h,031h,001h
|
||||
db 083h,01Eh,001h,080h,083h,012h,001h,083h,031h,001h,083h,019h,001h,080h,009h,000h
|
||||
db 000h,000h,000h,008h,000h,001h,000h,083h,014h,001h,083h,033h,001h,083h,01Bh,001h
|
||||
db 080h,083h,020h,001h,083h,031h,001h,083h,014h,001h,080h,083h,01Bh,001h,083h,030h
|
||||
db 001h,083h,020h,001h,080h,083h,014h,001h,083h,031h,001h,083h,01Bh,001h,080h,009h
|
||||
db 000h,000h,000h,000h,008h,000h,001h,000h,083h,016h,001h,083h,030h,001h,083h,01Dh
|
||||
db 001h,083h,031h,001h,083h,022h,001h,083h,035h,001h,083h,016h,001h,098h,00Ah,001h
|
||||
db 083h,01Dh,001h,088h,00Ah,083h,022h,001h,081h,061h,083h,016h,001h,080h,083h,01Dh
|
||||
db 001h,080h,009h,000h,000h,000h,000h,008h,000h,001h,000h,083h,016h,001h,080h,083h
|
||||
db 01Dh,001h,080h,083h,022h,001h,080h,083h,016h,001h,080h,083h,018h,001h,080h,083h
|
||||
db 01Dh,001h,080h,083h,011h,001h,080h,083h,018h,001h,080h,009h,000h,000h,000h,000h
|
||||
db 008h,000h,001h,000h,083h,016h,001h,083h,030h,001h,083h,01Dh,001h,083h,031h,001h
|
||||
db 083h,019h,001h,083h,02Eh,001h,083h,016h,001h,098h,00Ah,001h,083h,01Dh,001h,088h
|
||||
db 00Ah,083h,019h,001h,081h,061h,083h,016h,001h,080h,083h,01Dh,001h,080h,0F1h,000h
|
||||
db 000h,000h
|
||||
xm_unused_001 LABEL BYTE
|
||||
|
||||
; The following 23 bytes are not used.
|
||||
; So, let's place the MessageBox text and caption instead.
|
||||
; UI text messages.
|
||||
msg_txt db "uFMOD ruleZ!"
|
||||
msg_txt_l equ $ - msg_txt
|
||||
msg_cap db "MASM32",0
|
||||
err_cap db ":-(",0
|
||||
|
||||
org xm_unused_001 + 23
|
||||
db 001h,000h,012h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 000h,000h,000h,000h,000h,000h,000h,000h,040h,000h,008h,000h,02Ch,000h,00Eh,000h
|
||||
db 008h,000h,018h,000h,016h,000h,020h,000h,008h,000h,02Dh,000h,00Dh,000h,032h,000h
|
||||
db 004h,000h,03Ch,000h,007h,000h,044h,000h,004h,000h,05Ah,000h,000h,000h,064h,000h
|
||||
db 000h,000h,06Eh,000h,000h,000h,000h,000h,020h,000h,00Ah,000h,028h,000h,01Eh,000h
|
||||
db 018h,000h,032h,000h,020h,000h,03Ch,000h,020h,000h,046h,000h,020h,000h,050h,000h
|
||||
db 020h,000h,05Ah,000h,020h,000h,064h,000h,020h,000h,06Eh,000h,020h,000h,078h,000h
|
||||
db 020h,000h,082h,000h,020h,000h,009h,006h,001h,002h,004h,002h,003h,005h,001h,000h
|
||||
db 000h,000h,000h,000h,080h,000h,00Ch,000h,000h,000h,000h,000h,000h,000h,00Ch,000h
|
||||
db 000h,000h,040h,000h,001h,080h,0F9h,000h,0BFh,000h,0C3h,000h,00Ah,000h,057h,000h
|
||||
db 06Eh,000h,023h,000h
|
||||
|
||||
; ----------------------------------------------------------
|
||||
; void MessageBoxCB(szCap, lpString, cbString, cbProc);
|
||||
; ----------------------------------------------------------
|
||||
|
||||
; This is similar to a Win32 MessageBox. The box is centered
|
||||
; on screen. It contains a single-line text message and an
|
||||
; "OK" button. This function returns when user closes the
|
||||
; box (via the X button or via the OK button). An optional
|
||||
; callback subroutine may be specified to be called when no
|
||||
; events are pending in the event queue.
|
||||
|
||||
; NOTE: Doesn't work if you already have defined a window
|
||||
; in the current process! Doesn't modify the event mask. So,
|
||||
; make sure keyboard events are enabled before calling this
|
||||
; function. This function doesn't check the validity of the
|
||||
; supplied parameters!
|
||||
|
||||
; Parameters:
|
||||
; szCap - A pointer to the ASCIIz string containing the
|
||||
; caption. A trailing zero char IS required.
|
||||
; lpString - A pointer to an ASCII string containing a single
|
||||
; line message to pop up in the box. No trailing
|
||||
; zero char is required.
|
||||
; cbString - number of characters in string.
|
||||
; cbProc - Address of the callback subroutine. Can be NULL.
|
||||
|
||||
sOK db "OK"
|
||||
MessageBoxCB:
|
||||
; EBP = 0
|
||||
mov esi,[esp+12] ; cbString
|
||||
mov edi,[esp+4] ; szCap
|
||||
|
||||
; Get screen metrics.
|
||||
lea eax,[ebp+14]
|
||||
int 40h
|
||||
mov ecx,eax
|
||||
movzx eax,ax
|
||||
shr ecx,16 ; screen w
|
||||
xchg eax,edx ; screen h
|
||||
lea ebx,[esi*2+esi]
|
||||
lea ebx,[ebx*2+28] ; w = string len * 6 + 28
|
||||
sub ecx,ebx
|
||||
shr ecx,1
|
||||
shl ecx,16
|
||||
or ebx,ecx
|
||||
lea ecx,[ebp+52h] ; h = 52h
|
||||
sub edx,ecx
|
||||
shr edx,1
|
||||
shl edx,16
|
||||
or ecx,edx ; y = (screen h - window h) / 2
|
||||
mov edx,ebx ; x = (screen w - window w) / 2
|
||||
|
||||
_MessageBoxCB_redraw:
|
||||
; Start redraw.
|
||||
push edx
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+1]
|
||||
int 40h
|
||||
|
||||
; Define and draw window.
|
||||
xor eax,eax
|
||||
mov ebx,edx ; x, w (ECX: y, h)
|
||||
mov edx,34C0C0C0h ; style and BG color
|
||||
int 40h
|
||||
|
||||
; Define the OK button.
|
||||
push esi
|
||||
lea eax,[ebp+8]
|
||||
sub ebx,28+0Ah
|
||||
shr bx,1
|
||||
shl ebx,16 ; x = (window w - button w) / 2
|
||||
mov bx,18+0Ah ; w = 18 + 0Ah
|
||||
mov ecx,001C0012h ; y = 1Ch, h = 12h
|
||||
lea edx,[ebp+1] ; ID = close
|
||||
mov esi,0C0C0C0h ; color
|
||||
int 40h
|
||||
|
||||
; Draw the OK label.
|
||||
lea eax,[ebp+4]
|
||||
add ebx,90000h ; x = button x + 9
|
||||
mov bx,22h ; y = 22h
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,OFFSET sOK ; string
|
||||
lea esi,[ebp+2] ; length
|
||||
int 40h
|
||||
pop esi
|
||||
|
||||
; Draw text string.
|
||||
lea eax,[ebp+4]
|
||||
mov ebx,000A000Ah ; x = 0Ah, y = 0Ah
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,[esp+12] ; lpString
|
||||
int 40h
|
||||
|
||||
; End redraw.
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+2]
|
||||
int 40h
|
||||
|
||||
_MessageBoxCB_eventloop:
|
||||
mov edx,[esp+20] ; cbProc
|
||||
test edx,edx
|
||||
lea eax,[ebp+10]
|
||||
jz _MessageBoxCB_peekevent
|
||||
|
||||
; Invoke the callback.
|
||||
call edx
|
||||
|
||||
lea eax,[ebp+23]
|
||||
lea ebx,[ebp+10] ; wait for at most 0.1 sec
|
||||
_MessageBoxCB_peekevent:
|
||||
int 40h
|
||||
dec eax
|
||||
js _MessageBoxCB_eventloop
|
||||
|
||||
pop edx
|
||||
jz _MessageBoxCB_redraw
|
||||
ret
|
||||
|
||||
.DATA?
|
||||
BSS_START LABEL BYTE
|
||||
db 1020 dup (?)
|
||||
STACK_B dd ? ; Stack bottom
|
||||
BSS_END LABEL BYTE
|
||||
|
||||
END _START
|
241
programs/develop/libraries/ufmod/Masm32/ufmod.inc
Normal file
241
programs/develop/libraries/ufmod/Masm32/ufmod.inc
Normal file
@ -0,0 +1,241 @@
|
||||
; uFMOD header file
|
||||
; Target OS: KolibriOS
|
||||
; Compiler: MASM32
|
||||
|
||||
; HANDLE uFMOD_LoadSong(
|
||||
; void *lpXM,
|
||||
; void *param,
|
||||
; int fdwSong
|
||||
; )
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Loads the given XM song and starts playing it as soon as you
|
||||
; call uFMOD_WaveOut for the first time. Playback won't begin
|
||||
; if XM_SUSPENDED flag is specified. It will stop any currently
|
||||
; playing song before loading the new one.
|
||||
; ---
|
||||
; Parameters:
|
||||
; ---
|
||||
; lpXM
|
||||
; Specifies the song to load. If this parameter is 0, any
|
||||
; currently playing song is stopped. In such a case, function
|
||||
; does not return a meaningful value. fdwSong parameter
|
||||
; determines whether this value is interpreted as a filename
|
||||
; or as a pointer to an image of the song in memory.
|
||||
; param
|
||||
; If XM_MEMORY is specified, this parameter should be the size
|
||||
; of the image of the song in memory.
|
||||
; If XM_FILE is specified, this parameter is ignored.
|
||||
; fdwSong
|
||||
; Flags for playing the song. The following values are defined:
|
||||
; XM_FILE lpXM points to filename. param is ignored.
|
||||
; XM_MEMORY lpXM points to an image of a song in memory.
|
||||
; param is the image size. Once, uFMOD_LoadSong
|
||||
; returns, it's safe to free/discard the memory
|
||||
; buffer.
|
||||
; XM_NOLOOP An XM track plays repeatedly by default. Specify
|
||||
; this flag to play it only once.
|
||||
; XM_SUSPENDED The XM track is loaded in a suspended state,
|
||||
; and will not play until the uFMOD_Resume function
|
||||
; is called. This is useful for preloading a song
|
||||
; or testing an XM track for validity.
|
||||
; ---
|
||||
; Return Values:
|
||||
; ---
|
||||
; On success, returns the handle of the Infinity Sound driver.
|
||||
; Returns 0 on failure.
|
||||
uFMOD_LoadSong PROTO C :DWORD,:DWORD,:DWORD
|
||||
|
||||
; int uFMOD_WaveOut(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Updates the internal playback buffer.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function should be called from the same thread
|
||||
; uFMOD_LoadSong was previously called. Playback doesn't actually
|
||||
; begin when calling uFMOD_LoadSong, but when calling uFMOD_WaveOut
|
||||
; after a successful uFMOD_LoadSong call. Afterwards, you should
|
||||
; call uFMOD_WaveOut repeatedly at least once every 250 ms to
|
||||
; prevent "buffer underruns".
|
||||
; uFMOD_WaveOut is a non-blocking function. The accuracy of the
|
||||
; InfoAPI functions (uFMOD_GetStats, uFMOD_GetRowOrder and
|
||||
; uFMOD_GetTime) depends on the periodicity of this function being
|
||||
; invoked.
|
||||
; ---
|
||||
; Return Values:
|
||||
; ---
|
||||
; Returns non zero on error.
|
||||
uFMOD_WaveOut PROTO C
|
||||
|
||||
; void uFMOD_StopSong(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Stops the currently playing song, freeing the associated
|
||||
; resources.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; Does nothing if no song is playing at the time the call is made.
|
||||
uFMOD_StopSong PROTO C
|
||||
|
||||
; void uFMOD_Jump2Pattern(
|
||||
; unsigned int pat
|
||||
; )
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Jumps to the specified pattern index.
|
||||
; ---
|
||||
; Parameters:
|
||||
; ---
|
||||
; pat
|
||||
; Next zero based pattern index.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; uFMOD doesn't automatically perform Note Off effects before jumping
|
||||
; to the target pattern. In other words, the original pattern will
|
||||
; remain in the mixer until it fades out. You can use this feature to
|
||||
; your advantage. If you don't like it, just insert leading Note Off
|
||||
; commands in all patterns intended to be used as uFMOD_Jump2Pattern
|
||||
; targets.
|
||||
; if the pattern index lays outside of the bounds of the pattern order
|
||||
; table, calling this function jumps to pattern 0, effectively
|
||||
; rewinding playback.
|
||||
uFMOD_Jump2Pattern PROTO C :DWORD
|
||||
|
||||
; void uFMOD_Pause(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Pauses the currently playing song, if any.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; While paused you can still control the volume (uFMOD_SetVolume) and
|
||||
; the pattern order (uFMOD_Jump2Pattern). The RMS volume coefficients
|
||||
; (uFMOD_GetStats) will go down to 0 and the progress tracker
|
||||
; (uFMOD_GetTime) will "freeze" while the song is paused.
|
||||
; uFMOD_Pause doesn't perform the request immediately. Instead, it
|
||||
; signals to pause when playback reaches next chunk of data.
|
||||
; This way, uFMOD_Pause performs asynchronously and returns very fast.
|
||||
; It is not cumulative. So, calling uFMOD_Pause many times in a row
|
||||
; has the same effect as calling it once.
|
||||
; You shouldn't stop calling uFMOD_WaveOut while the song is paused!
|
||||
uFMOD_Pause PROTO C
|
||||
|
||||
; void uFMOD_Resume(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Resumes the currently paused song, if any.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; uFMOD_Resume doesn't perform the request immediately. Instead, it
|
||||
; signals to resume when uFMOD_WaveOut is called again. uFMOD_Resume
|
||||
; is not cumulative. So, calling it many times in a row has the same
|
||||
; effect as calling it once.
|
||||
uFMOD_Resume PROTO C
|
||||
|
||||
; unsigned int uFMOD_GetStats(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the current RMS volume coefficients in (L)eft and (R)ight
|
||||
; channels.
|
||||
; low-order word: RMS volume in R channel
|
||||
; hi-order word: RMS volume in L channel
|
||||
; Range from 0 (silence) to $7FFF (maximum) on each channel.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function is useful for updating a VU meter. It's recommended
|
||||
; to rescale the output to log10 (decibels or dB for short), because
|
||||
; human ears track volume changes in a dB scale. You may call
|
||||
; uFMOD_GetStats() as often as you like, but take in mind that uFMOD
|
||||
; updates both channel RMS volumes at the same rate uFMOD_WaveOut
|
||||
; function is called. In other words, you should call uFMOD_WaveOut
|
||||
; more often to increase the accuracy of uFMOD_GetStats.
|
||||
uFMOD_GetStats PROTO C
|
||||
|
||||
; unsigned int uFMOD_GetRowOrder(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the currently playing row and order.
|
||||
; low-order word: row
|
||||
; hi-order word: order
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function is useful for synchronization. uFMOD updates both
|
||||
; row and order values at the same rate uFMOD_WaveOut function is
|
||||
; called. In other words, you should call uFMOD_WaveOut more often
|
||||
; to increase the accuracy of uFMOD_GetRowOrder.
|
||||
uFMOD_GetRowOrder PROTO C
|
||||
|
||||
; unsigned int uFMOD_GetTime(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the time in milliseconds since the song was started.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function is useful for synchronizing purposes. Multimedia
|
||||
; applications can use uFMOD_GetTime to synchronize GFX to sound,
|
||||
; for example. An XM player can use this function to update a progress
|
||||
; meter.
|
||||
uFMOD_GetTime PROTO C
|
||||
|
||||
; unsigned char* uFMOD_GetTitle(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the current song's title.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; Not every song has a title, so be prepared to get an empty string.
|
||||
uFMOD_GetTitle PROTO C
|
||||
|
||||
; void uFMOD_SetVolume(
|
||||
; unsigned int vol
|
||||
; )
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Sets the global volume. The volume scale is linear.
|
||||
; ---
|
||||
; Parameters:
|
||||
; ---
|
||||
; vol
|
||||
; New volume. Range: from uFMOD_MIN_VOL (muting) to uFMOD_MAX_VOL
|
||||
; (maximum volume). Any value above uFMOD_MAX_VOL maps to maximum
|
||||
; volume.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; uFMOD internally converts the given values to a logarithmic scale (dB).
|
||||
; Maximum volume is set by default. The volume value is preserved across
|
||||
; uFMOD_LoadSong calls. You can set the desired volume level before
|
||||
; actually starting to play a song.
|
||||
; You can use Infinity Sound API to control the L and R channels volumes
|
||||
; separately. It also has a wider range than uFMOD_SetVolume, sometimes
|
||||
; allowing to amplify the sound volume as well, as opposed to
|
||||
; uFMOD_SetVolume only being able to attenuate it.
|
||||
uFMOD_SetVolume PROTO C :DWORD
|
||||
|
||||
XM_MEMORY EQU 1
|
||||
XM_FILE EQU 2
|
||||
XM_NOLOOP EQU 8
|
||||
XM_SUSPENDED EQU 16
|
||||
uFMOD_MIN_VOL EQU 0
|
||||
uFMOD_MAX_VOL EQU 25
|
||||
uFMOD_DEFAULT_VOL EQU 25
|
BIN
programs/develop/libraries/ufmod/Masm32/ufmod.obj
Normal file
BIN
programs/develop/libraries/ufmod/Masm32/ufmod.obj
Normal file
Binary file not shown.
18
programs/develop/libraries/ufmod/Nasm/make.bat
Normal file
18
programs/develop/libraries/ufmod/Nasm/make.bat
Normal file
@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
rem Compiler: NASM
|
||||
rem Target OS: KolibriOS
|
||||
|
||||
rem NASM Path:
|
||||
SET UF_NASM=\nasm
|
||||
|
||||
if not exist "%UF_NASM%\nasmw.exe" goto Err1
|
||||
"%UF_NASM%\nasmw" -fbin -t -O5 -i..\ufmodlib\src\ mini.asm
|
||||
goto TheEnd
|
||||
|
||||
:Err1
|
||||
echo Couldn't find nasmw.exe in %UF_NASM%\
|
||||
|
||||
:TheEnd
|
||||
pause
|
||||
@echo on
|
||||
cls
|
225
programs/develop/libraries/ufmod/Nasm/mini.asm
Normal file
225
programs/develop/libraries/ufmod/Nasm/mini.asm
Normal file
@ -0,0 +1,225 @@
|
||||
; MINI.ASM
|
||||
; --------
|
||||
; Minimalistic uFMOD usage example.
|
||||
|
||||
; Shows how to play an XM track in memory,
|
||||
; including proper error handling.
|
||||
|
||||
BITS 32
|
||||
org 0
|
||||
db "MENUET01"
|
||||
dd 1
|
||||
dd START ; Entry point
|
||||
dd uFMOD_IMG_END ; End of code and initialized data
|
||||
dd MEMORY_END ; End of uninitialized (BSS) data
|
||||
dd STACK_B ; Bottom of the stack
|
||||
dd 0 ; Args
|
||||
dd 0 ; Reserved
|
||||
|
||||
; uFMOD setup:
|
||||
%define f48000 ; Set sampling rate to 48KHz (22050, 44100, 48000)
|
||||
%define STRONG ; Select STRONG interpolation (NONE, WEAK, STRONG)
|
||||
%define UNSAFE ; Select UNSAFE mode (NORMAL, UNSAFE)
|
||||
%define NODEBUG ; Skip debug-board messages
|
||||
%define NOLINKER ; Select "no linker" mode
|
||||
|
||||
; uFMOD constants:
|
||||
%define uFMOD_MIN_VOL 0
|
||||
%define uFMOD_MAX_VOL 25
|
||||
%define uFMOD_DEFAULT_VOL 25
|
||||
|
||||
; The XM track.
|
||||
xm incbin "..\ufmodlib\media\mini.xm"
|
||||
xm_length equ $ - xm
|
||||
|
||||
; Optimization:
|
||||
; This header file is suitable for mini.xm track only!
|
||||
; If you change the track, update the optimization header.
|
||||
; (Use the standart eff.inc file for a general purpose player app.)
|
||||
%include "..\ufmodlib\media\mini.eff.inc"
|
||||
|
||||
; UI text messages.
|
||||
msg_txt db "uFMOD ruleZ!"
|
||||
msg_txt_l equ $ - msg_txt
|
||||
msg_cap db "NASM",0
|
||||
err_txt db "Error"
|
||||
err_txt_l equ $ - err_txt
|
||||
err_cap db ":-(",0
|
||||
|
||||
START:
|
||||
; Start playback.
|
||||
push XM_MEMORY
|
||||
push xm_length
|
||||
push xm
|
||||
call _uFMOD_LoadSong
|
||||
|
||||
; Stack fixing is required here, but in this simple
|
||||
; example leaving ESP as it is won't harm. In a real
|
||||
; application you should uncomment the following line:
|
||||
; add esp,12
|
||||
|
||||
test eax,eax
|
||||
jz error
|
||||
|
||||
; Wait for user input.
|
||||
push _uFMOD_WaveOut ; cbProc <- continue fetching data!
|
||||
push msg_txt_l ; cbString
|
||||
push msg_txt ; lpString
|
||||
push msg_cap ; szCap
|
||||
call _MessageBoxCB
|
||||
; add esp,16
|
||||
|
||||
; Stop playback.
|
||||
call _uFMOD_StopSong
|
||||
|
||||
r: ; Exit.
|
||||
xor eax,eax
|
||||
dec eax
|
||||
int 40h
|
||||
|
||||
error:
|
||||
push 0 ; cbProc <- no callback
|
||||
push err_txt_l ; cbString
|
||||
push err_txt ; lpString
|
||||
push err_cap ; szCap
|
||||
call _MessageBoxCB
|
||||
; add esp,16
|
||||
jmp r
|
||||
|
||||
; ---------------------------------------------------------------
|
||||
; void _cdecl _MessageBoxCB(szCap, lpString, cbString, cbProc);
|
||||
; ---------------------------------------------------------------
|
||||
|
||||
; This is similar to a Win32 MessageBox. The box is centered
|
||||
; on screen. It contains a single-line text message and an
|
||||
; "OK" button. This function returns when user closes the
|
||||
; box (via the X button or via the OK button). An optional
|
||||
; callback subroutine may be specified to be called when no
|
||||
; events are pending in the event queue.
|
||||
|
||||
; NOTE: Doesn't work if you already have defined a window
|
||||
; in the current process! Doesn't modify the event mask. So,
|
||||
; make sure keyboard events are enabled before calling this
|
||||
; function. This function doesn't check the validity of the
|
||||
; supplied parameters!
|
||||
|
||||
; Parameters:
|
||||
; szCap - A pointer to the ASCIIz string containing the
|
||||
; caption. A trailing zero char IS required.
|
||||
; lpString - A pointer to an ASCII string containing a single
|
||||
; line message to pop up in the box. No trailing
|
||||
; zero char is required.
|
||||
; cbString - number of characters in string.
|
||||
; cbProc - Address of the callback subroutine. Can be NULL.
|
||||
|
||||
sOK db "OK"
|
||||
_MessageBoxCB:
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
push ebx
|
||||
xor ebp,ebp ; global 0
|
||||
mov esi,[esp+28] ; cbString
|
||||
mov edi,[esp+20] ; szCap
|
||||
|
||||
; Get screen metrics.
|
||||
lea eax,[ebp+14]
|
||||
int 40h
|
||||
mov ecx,eax
|
||||
movzx eax,ax
|
||||
shr ecx,16 ; screen w
|
||||
xchg eax,edx ; screen h
|
||||
lea ebx,[esi*2+esi]
|
||||
lea ebx,[ebx*2+28] ; w = string len * 6 + 28
|
||||
sub ecx,ebx
|
||||
shr ecx,1
|
||||
shl ecx,16
|
||||
or ebx,ecx
|
||||
lea ecx,[ebp+52h] ; h = 52h
|
||||
sub edx,ecx
|
||||
shr edx,1
|
||||
shl edx,16
|
||||
or ecx,edx ; y = (screen h - window h) / 2
|
||||
mov edx,ebx ; x = (screen w - window w) / 2
|
||||
|
||||
_MessageBoxCB_redraw:
|
||||
; Start redraw.
|
||||
push edx
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+1]
|
||||
int 40h
|
||||
|
||||
; Define and draw window.
|
||||
xor eax,eax
|
||||
mov ebx,edx ; x, w (ECX: y, h)
|
||||
mov edx,34C0C0C0h ; style and BG color
|
||||
int 40h
|
||||
|
||||
; Define the OK button.
|
||||
push esi
|
||||
lea eax,[ebp+8]
|
||||
sub ebx,28+0Ah
|
||||
shr bx,1
|
||||
shl ebx,16 ; x = (window w - button w) / 2
|
||||
mov bx,18+0Ah ; w = 18 + 0Ah
|
||||
mov ecx,001C0012h ; y = 1Ch, h = 12h
|
||||
lea edx,[ebp+1] ; ID = close
|
||||
mov esi,0C0C0C0h ; color
|
||||
int 40h
|
||||
|
||||
; Draw the OK label.
|
||||
lea eax,[ebp+4]
|
||||
add ebx,90000h ; x = button x + 9
|
||||
mov bx,22h ; y = 22h
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,sOK ; string
|
||||
lea esi,[ebp+2] ; length
|
||||
int 40h
|
||||
pop esi
|
||||
|
||||
; Draw text string.
|
||||
lea eax,[ebp+4]
|
||||
mov ebx,000A000Ah ; x = 0Ah, y = 0Ah
|
||||
xor ecx,ecx ; style, font and color
|
||||
mov edx,[esp+28] ; lpString
|
||||
int 40h
|
||||
|
||||
; End redraw.
|
||||
lea eax,[ebp+12]
|
||||
lea ebx,[ebp+2]
|
||||
int 40h
|
||||
|
||||
_MessageBoxCB_eventloop:
|
||||
mov edx,[esp+36] ; cbProc
|
||||
test edx,edx
|
||||
lea eax,[ebp+10]
|
||||
jz _MessageBoxCB_peekevent
|
||||
|
||||
; Invoke the callback.
|
||||
call edx
|
||||
|
||||
lea eax,[ebp+23]
|
||||
lea ebx,[ebp+10] ; wait for at most 0.1 sec
|
||||
_MessageBoxCB_peekevent:
|
||||
int 40h
|
||||
dec eax
|
||||
js _MessageBoxCB_eventloop
|
||||
|
||||
pop edx
|
||||
jz _MessageBoxCB_redraw
|
||||
|
||||
pop ebx
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
; Include the whole uFMOD sources here. (Right after
|
||||
; your main code to avoid naming conflicts, but still
|
||||
; inside your code section.)
|
||||
%include "nasm.asm"
|
||||
|
||||
alignb 4
|
||||
resb 1020
|
||||
STACK_B resd 1 ; Stack bottom
|
||||
MEMORY_END: ; End of uninitialized (BSS) data
|
3374
programs/develop/libraries/ufmod/core.asm
Normal file
3374
programs/develop/libraries/ufmod/core.asm
Normal file
File diff suppressed because it is too large
Load Diff
60
programs/develop/libraries/ufmod/eff.inc
Normal file
60
programs/develop/libraries/ufmod/eff.inc
Normal file
@ -0,0 +1,60 @@
|
||||
; XM-file: full.xm
|
||||
|
||||
; uFMOD optional features:
|
||||
INFO_API_ON equ 1 ; enable InfoAPI
|
||||
NOLOOP_ON equ 1 ; enable XM_NOLOOP
|
||||
PAUSE_RESUME_ON equ 1 ; enable pause/resume and XM_SUSPENDED
|
||||
VOL_CONTROL_ON equ 1 ; enable volume control
|
||||
JUMP_TO_PAT_ON equ 1 ; enable Jump2Pattern
|
||||
XM_FILE_ON equ 1 ; enable file loading
|
||||
|
||||
; Special flags:
|
||||
INSTRUMENTVIBRATO_ON equ 1
|
||||
VOLUMEENVELOPE_ON equ 1
|
||||
PANENVELOPE_ON equ 1
|
||||
VOLUMEBYTE_ON equ 1
|
||||
ADPCM_ON equ 1
|
||||
AMIGAPERIODS_ON equ 1
|
||||
|
||||
; XM effects:
|
||||
ARPEGGIO_ON equ 1
|
||||
PORTAUP_ON equ 1
|
||||
PORTADOWN_ON equ 1
|
||||
PORTATO_ON equ 1
|
||||
VIBRATO_ON equ 1
|
||||
PORTATOVOLSLIDE_ON equ 1
|
||||
VIBRATOVOLSLIDE_ON equ 1
|
||||
TREMOLO_ON equ 1
|
||||
SETPANPOSITION_ON equ 1
|
||||
SETSAMPLEOFFSET_ON equ 1
|
||||
VOLUMESLIDE_ON equ 1
|
||||
PATTERNJUMP_ON equ 1
|
||||
SETVOLUME_ON equ 1
|
||||
PATTERNBREAK_ON equ 1
|
||||
SETSPEED_ON equ 1
|
||||
SETGLOBALVOLUME_ON equ 1
|
||||
GLOBALVOLSLIDE_ON equ 1
|
||||
KEYOFF_ON equ 1
|
||||
SETENVELOPEPOS_ON equ 1
|
||||
PANSLIDE_ON equ 1
|
||||
MULTIRETRIG_ON equ 1
|
||||
TREMOR_ON equ 1
|
||||
EXTRAFINEPORTA_ON equ 1
|
||||
FINEPORTAUP_ON equ 1
|
||||
FINEPORTADOWN_ON equ 1
|
||||
SETVIBRATOWAVE_ON equ 1
|
||||
SETFINETUNE_ON equ 1
|
||||
PATTERNLOOP_ON equ 1
|
||||
SETTREMOLOWAVE_ON equ 1
|
||||
SETPANPOSITION16_ON equ 1
|
||||
RETRIG_ON equ 1
|
||||
NOTECUT_ON equ 1
|
||||
NOTEDELAY_ON equ 1
|
||||
PATTERNDELAY_ON equ 1
|
||||
PORTAUP_OR_DOWN_ON equ 1
|
||||
VIBRATO_OR_VOLSLIDE equ 1
|
||||
VIBRATO_OR_TREMOLO equ 1
|
||||
PORTATO_OR_VOLSLIDE equ 1
|
||||
VOLUME_OR_PANENVELOPE equ 1
|
||||
ROWCOMMANDS_ON equ 1
|
||||
FINEVOLUMESLIDE_ON equ 1
|
342
programs/develop/libraries/ufmod/fasm.asm
Normal file
342
programs/develop/libraries/ufmod/fasm.asm
Normal file
@ -0,0 +1,342 @@
|
||||
; FASM.ASM
|
||||
; --------
|
||||
; uFMOD public source code release. Provided as-is.
|
||||
|
||||
; *** This stub allows compiling uFMOD sources using FASM.
|
||||
|
||||
; *** CONSTANTS ***
|
||||
|
||||
if UF_FREQ eq 44100
|
||||
FSOUND_MixRate = 44100
|
||||
FREQ_40HZ_p = 1DB8Bh
|
||||
FREQ_40HZ_f = 3B7160h
|
||||
PCM_format = 3 ; PCM_2_16_44
|
||||
else
|
||||
if UF_FREQ eq 22050
|
||||
FSOUND_MixRate = 22050
|
||||
FREQ_40HZ_p = 3B716h
|
||||
FREQ_40HZ_f = 76E2C0h
|
||||
PCM_format = 9 ; PCM_2_16_22
|
||||
else
|
||||
if UF_FREQ eq 48000
|
||||
else
|
||||
display 'UF_FREQ not specified (defaulting to 48KHz)',13,10
|
||||
end if
|
||||
FSOUND_MixRate = 48000
|
||||
FREQ_40HZ_p = 1B4E8h
|
||||
FREQ_40HZ_f = 369D00h
|
||||
PCM_format = 1 ; PCM_2_16_48
|
||||
end if
|
||||
end if
|
||||
|
||||
if UF_RAMP eq NONE
|
||||
RAMP_NONE = 1
|
||||
RAMP_WEAK = 0
|
||||
RAMP_STRONG = 0
|
||||
else
|
||||
if UF_RAMP eq WEAK
|
||||
RAMP_NONE = 0
|
||||
RAMP_WEAK = 1
|
||||
RAMP_STRONG = 0
|
||||
else
|
||||
if UF_RAMP eq STRONG
|
||||
else
|
||||
display 'UF_RAMP not specified (defaulting to STRONG)',13,10
|
||||
end if
|
||||
RAMP_NONE = 0
|
||||
RAMP_WEAK = 0
|
||||
RAMP_STRONG = 1
|
||||
end if
|
||||
end if
|
||||
|
||||
UCODE equ 0
|
||||
|
||||
if UF_MODE eq UNSAFE
|
||||
display 'WARNING! Unsafe mod is ON. Library may crash while loading damaged XM tracks!',13,10
|
||||
CHK4VALIDITY = 0
|
||||
AC97SND_ON = 0
|
||||
else
|
||||
CHK4VALIDITY = 1
|
||||
if UF_MODE eq AC97SND
|
||||
AC97SND_ON = 1
|
||||
else
|
||||
AC97SND_ON = 0
|
||||
end if
|
||||
end if
|
||||
|
||||
if NOLINKER
|
||||
else
|
||||
format MS COFF
|
||||
section '.text' code readable executable
|
||||
end if
|
||||
|
||||
; *** STRUCTS ***
|
||||
|
||||
; Sample type - contains info on sample
|
||||
struc FSOUND_SAMPLE{
|
||||
|
||||
; Don't change order .:.
|
||||
._length dd ? ; sample length
|
||||
.loopstart dd ? ; loop start
|
||||
.looplen dd ? ; loop length
|
||||
.defvol db ? ; default volume
|
||||
.finetune db ? ; finetune value from -128 to 127
|
||||
.bytes db ? ; type [b 0-1] : 0 - no loop
|
||||
; 1 - forward loop
|
||||
; 2 - bidirectional loop (aka ping-pong)
|
||||
; [b 4] : 0 - 8-bit sample data
|
||||
; 1 - 16-bit sample data
|
||||
.defpan db ? ; default pan value from 0 to 255
|
||||
.relative db ? ; relative note (signed value)
|
||||
.Resved db ? ; reserved, known values: 00h - regular delta packed sample data
|
||||
; ADh - ModPlug 4-bit ADPCM packed sample data
|
||||
; .:.
|
||||
|
||||
.loopmode db ?
|
||||
._align db ?
|
||||
.buff db ?,? ; sound data
|
||||
}
|
||||
virtual at 0
|
||||
FSOUND_SAMPLE FSOUND_SAMPLE
|
||||
FSOUND_SAMPLE_size = $-FSOUND_SAMPLE
|
||||
end virtual
|
||||
|
||||
|
||||
; Channel type - contains information on a mixing channel
|
||||
struc FSOUND_CHANNEL{
|
||||
.actualvolume dd ? ; driver level current volume
|
||||
.actualpan dd ? ; driver level panning value
|
||||
.fsampleoffset dd ? ; sample offset (sample starts playing from here)
|
||||
.leftvolume dd ? ; mixing information. adjusted volume for left channel (panning involved)
|
||||
.rightvolume dd ? ; mixing information. adjusted volume for right channel (panning involved)
|
||||
.mixpos dd ? ; mixing information. high part of 32:32 fractional position in sample
|
||||
.speedlo dd ? ; mixing information. playback rate - low part fractional
|
||||
.speedhi dd ? ; mixing information. playback rate - high part fractional
|
||||
.ramp_lefttarget dw ?
|
||||
.ramp_righttarget dw ?
|
||||
.ramp_leftspeed dd ?
|
||||
.ramp_rightspeed dd ?
|
||||
|
||||
; Don't change order .:.
|
||||
.fsptr dd ? ; pointer to FSOUND_SAMPLE currently playing sample
|
||||
.mixposlo dd ? ; mixing information. low part of 32:32 fractional position in sample
|
||||
.ramp_leftvolume dd ?
|
||||
.ramp_rightvolume dd ?
|
||||
.ramp_count dw ?
|
||||
.speeddir db ?,? ; mixing information. playback direction - forwards or backwards
|
||||
; .:.
|
||||
|
||||
}
|
||||
virtual at 0
|
||||
FSOUND_CHANNEL FSOUND_CHANNEL
|
||||
FSOUND_CHANNEL_size = $-FSOUND_CHANNEL
|
||||
end virtual
|
||||
|
||||
; Single note type - contains info on 1 note in a pattern
|
||||
struc FMUSIC_NOTE{
|
||||
.unote db ? ; note to play at (0-97) 97=keyoff
|
||||
.number db ? ; sample being played (0-128)
|
||||
.uvolume db ? ; volume column value (0-64) 255=no volume
|
||||
.effect db ? ; effect number (0-1Ah)
|
||||
.eparam db ? ; effect parameter (0-255)
|
||||
}
|
||||
virtual at 0
|
||||
FMUSIC_NOTE FMUSIC_NOTE
|
||||
FMUSIC_NOTE_size = $-FMUSIC_NOTE
|
||||
end virtual
|
||||
|
||||
; Pattern data type
|
||||
struc FMUSIC_PATTERN{
|
||||
.rows dw ?
|
||||
.patternsize dw ?
|
||||
.data dd ? ; pointer to FMUSIC_NOTE
|
||||
}
|
||||
virtual at 0
|
||||
FMUSIC_PATTERN FMUSIC_PATTERN
|
||||
FMUSIC_PATTERN_size = $-FMUSIC_PATTERN
|
||||
end virtual
|
||||
|
||||
; Multi sample extended instrument
|
||||
struc FMUSIC_INSTRUMENT{
|
||||
.sample rd 16 ; 16 pointers to FSOUND_SAMPLE per instrument
|
||||
|
||||
; Don't change order .:.
|
||||
.keymap rb 96 ; sample keymap assignments
|
||||
.VOLPoints rw 24 ; volume envelope points
|
||||
.PANPoints rw 24 ; panning envelope points
|
||||
.VOLnumpoints db ? ; number of volume envelope points
|
||||
.PANnumpoints db ? ; number of panning envelope points
|
||||
.VOLsustain db ? ; volume sustain point
|
||||
.VOLLoopStart db ? ; volume envelope loop start
|
||||
.VOLLoopEnd db ? ; volume envelope loop end
|
||||
.PANsustain db ? ; panning sustain point
|
||||
.PANLoopStart db ? ; panning envelope loop start
|
||||
.PANLoopEnd db ? ; panning envelope loop end
|
||||
.VOLtype db ? ; type of envelope,bit 0:On 1:Sustain 2:Loop
|
||||
.PANtype db ? ; type of envelope,bit 0:On 1:Sustain 2:Loop
|
||||
.VIBtype db ? ; instrument vibrato type
|
||||
.VIBsweep db ? ; time it takes for vibrato to fully kick in
|
||||
.iVIBdepth db ? ; depth of vibrato
|
||||
.VIBrate db ? ; rate of vibrato
|
||||
.VOLfade dw ? ; fade out value
|
||||
; .:.
|
||||
|
||||
}
|
||||
virtual at 0
|
||||
FMUSIC_INSTRUMENT FMUSIC_INSTRUMENT
|
||||
FMUSIC_INSTRUMENT_size = $-FMUSIC_INSTRUMENT
|
||||
end virtual
|
||||
|
||||
; Channel type - contains information on a mod channel
|
||||
struc FMUSIC_CHANNEL{
|
||||
.note db ? ; last note set in channel
|
||||
.samp db ? ; last sample set in channel
|
||||
.notectrl db ? ; flags for DoFlags proc
|
||||
.inst db ? ; last instrument set in channel
|
||||
.cptr dd ? ; pointer to FSOUND_CHANNEL system mixing channel
|
||||
.freq dd ? ; current mod frequency period for this channel
|
||||
.volume dd ? ; current mod volume for this channel
|
||||
.voldelta dd ? ; delta for volume commands... tremolo/tremor, etc
|
||||
.freqdelta dd ? ; delta for frequency commands... vibrato/arpeggio, etc
|
||||
.pan dd ? ; current mod pan for this channel
|
||||
|
||||
; Don't change order .:.
|
||||
.envvoltick dd ? ; tick counter for envelope position
|
||||
.envvolpos dd ? ; envelope position
|
||||
.envvoldelta dd ? ; delta step between points
|
||||
.envpantick dd ? ; tick counter for envelope position
|
||||
.envpanpos dd ? ; envelope position
|
||||
.envpandelta dd ? ; delta step between points
|
||||
.ivibsweeppos dd ? ; instrument vibrato sweep position
|
||||
.ivibpos dd ? ; instrument vibrato position
|
||||
.keyoff db ?,? ; flag whether keyoff has been hit or not
|
||||
.envvolstopped db ? ; flag to say whether envelope has finished or not
|
||||
.envpanstopped db ? ; flag to say whether envelope has finished or not
|
||||
; .:.
|
||||
|
||||
.envvolfrac dd ? ; fractional interpolated envelope volume
|
||||
.envvol dd ? ; final interpolated envelope volume
|
||||
.fadeoutvol dd ? ; volume fade out
|
||||
.envpanfrac dd ? ; fractional interpolated envelope pan
|
||||
.envpan dd ? ; final interpolated envelope pan
|
||||
.period dd ? ; last period set in channel
|
||||
.sampleoffset dd ? ; sample offset for this channel in SAMPLES
|
||||
.portatarget dd ? ; note to porta to
|
||||
.patloopno db ?,?,?,? ; pattern loop variables for effect E6x
|
||||
.patlooprow dd ?
|
||||
.realnote db ? ; last realnote set in channel
|
||||
.recenteffect db ? ; previous row's effect... used to correct tremolo volume
|
||||
.portaupdown db ? ; last porta up/down value
|
||||
db ? ; unused
|
||||
.xtraportadown db ? ; last porta down value
|
||||
.xtraportaup db ? ; last porta up value
|
||||
.volslide db ? ; last volume slide value
|
||||
.panslide db ? ; pan slide parameter
|
||||
.retrigx db ? ; last retrig volume slide used
|
||||
.retrigy db ? ; last retrig tick count used
|
||||
.portaspeed db ? ; porta speed
|
||||
.vibpos db ? ; vibrato position
|
||||
.vibspeed db ? ; vibrato speed
|
||||
.vibdepth db ? ; vibrato depth
|
||||
.tremolopos db ? ; tremolo position
|
||||
.tremolospeed db ? ; tremolo speed
|
||||
.tremolodepth db ? ; tremolo depth
|
||||
.tremorpos db ? ; tremor position
|
||||
.tremoron db ? ; remembered parameters for tremor
|
||||
.tremoroff db ? ; remembered parameters for tremor
|
||||
.wavecontrol db ? ; waveform type for vibrato and tremolo (4bits each)
|
||||
.finevslup db ? ; parameter for fine volume slide down
|
||||
.fineportaup db ? ; parameter for fine porta slide up
|
||||
.fineportadown db ? ; parameter for fine porta slide down
|
||||
}
|
||||
virtual at 0
|
||||
FMUSIC_CHANNEL FMUSIC_CHANNEL
|
||||
FMUSIC_CHANNEL_size = $-FMUSIC_CHANNEL
|
||||
end virtual
|
||||
|
||||
; Song type - contains info on song
|
||||
struc FMUSIC_MODULE{
|
||||
|
||||
; Don't change order .:.
|
||||
.pattern dd ? ; pointer to FMUSIC_PATTERN array for this song
|
||||
.instrument dd ? ; pointer to FMUSIC_INSTRUMENT array for this song
|
||||
.mixer_samplesleft dd ?
|
||||
.globalvolume dd ? ; global mod volume
|
||||
.tick dd ? ; current mod tick
|
||||
.speed dd ? ; speed of song in ticks per row
|
||||
.order dd ? ; current song order position
|
||||
.row dd ? ; current row in pattern
|
||||
.patterndelay dd ? ; pattern delay counter
|
||||
.nextorder dd ? ; current song order position
|
||||
.nextrow dd ? ; current row in pattern
|
||||
.unused1 dd ?
|
||||
.numchannels dd ? ; number of channels
|
||||
.Channels dd ? ; channel pool
|
||||
.uFMOD_Ch dd ? ; channel array for this song
|
||||
.mixer_samplespertick dd ?
|
||||
.numorders dw ? ; number of orders (song length)
|
||||
.restart dw ? ; restart position
|
||||
.numchannels_xm db ?
|
||||
.globalvsl db ? ; global mod volume
|
||||
.numpatternsmem dw ? ; number of allocated patterns
|
||||
.numinsts dw ? ; number of instruments
|
||||
.flags dw ? ; flags such as linear frequency, format specific quirks, etc
|
||||
.defaultspeed dw ?
|
||||
.defaultbpm dw ?
|
||||
.orderlist rb 256 ; pattern playing order list
|
||||
; .:.
|
||||
|
||||
}
|
||||
virtual at 0
|
||||
FMUSIC_MODULE FMUSIC_MODULE
|
||||
FMUSIC_MODULE_size = $-FMUSIC_MODULE
|
||||
end virtual
|
||||
|
||||
OFFSET equ
|
||||
PTR equ
|
||||
endif equ end if
|
||||
|
||||
include 'ufmod.asm'
|
||||
include 'core.asm'
|
||||
|
||||
if NOLINKER
|
||||
uFMOD_IMG_END: ; End of uFMOD's code. BSS follows.
|
||||
align 16
|
||||
else
|
||||
section '.bss' readable writeable align 16
|
||||
end if
|
||||
|
||||
; Don't change order!
|
||||
_mod rb FMUSIC_MODULE_size ; currently playing track
|
||||
mmt rd 3
|
||||
ufmod_heap dd ?
|
||||
dd ? ; unused
|
||||
if AC97SND_ON
|
||||
extrn hSound
|
||||
dd ?
|
||||
else
|
||||
hSound dd ?
|
||||
endif
|
||||
hBuff dd ?
|
||||
SW_Exit dd ?
|
||||
; mix buffer memory block (align 16!)
|
||||
MixBuf rb FSOUND_BlockSize*8
|
||||
ufmod_noloop db ?
|
||||
ufmod_pause_ db ?
|
||||
mix_endflag rb 2
|
||||
mmf rd 4
|
||||
ufmod_vol dd ? ; global volume scale
|
||||
; * LPCALLBACKS *
|
||||
uFMOD_fopen dd ?
|
||||
uFMOD_fread dd ?
|
||||
file_struct rd 7
|
||||
cache_offset dd ?
|
||||
if INFO_API_ON
|
||||
time_ms dd ?
|
||||
L_vol dw ? ; L channel RMS volume
|
||||
R_vol dw ? ; R channel RMS volume
|
||||
s_row dw ?
|
||||
s_order dw ?
|
||||
szTtl rb 24
|
||||
end if
|
||||
DummySamp rb FSOUND_SAMPLE_size
|
68
programs/develop/libraries/ufmod/makeobj.bat
Normal file
68
programs/develop/libraries/ufmod/makeobj.bat
Normal file
@ -0,0 +1,68 @@
|
||||
@echo off
|
||||
rem Make the uFMOD libraries in COFF object format
|
||||
rem Target OS: KolibriOS
|
||||
|
||||
rem *** CONFIG START
|
||||
rem *** Check the Readme docs for a complete reference
|
||||
rem *** on configuring the following options
|
||||
|
||||
rem Pathes:
|
||||
SET UF_MASM=\masm32\bin
|
||||
SET UF_NASM=\nasm
|
||||
SET UF_FASM=\fasm
|
||||
|
||||
rem Select compiler: MASM, NASM or FASM
|
||||
SET UF_ASM=FASM
|
||||
|
||||
rem Select mixing rate: 22050, 44100 or 48000 (22.05 KHz, 44.1 KHz or 48 KHz)
|
||||
SET UF_FREQ=48000
|
||||
|
||||
rem Set volume ramping mode (interpolation): NONE, WEAK or STRONG
|
||||
SET UF_RAMP=STRONG
|
||||
|
||||
rem Set build mode: NORMAL, UNSAFE or AC97SND
|
||||
SET UF_MODE=NORMAL
|
||||
rem *** CONFIG END
|
||||
|
||||
if %UF_ASM%==MASM goto MASM
|
||||
if %UF_ASM%==NASM goto NASM
|
||||
if %UF_ASM%==FASM goto FASM
|
||||
echo %UF_ASM% not supported
|
||||
goto TheEnd
|
||||
|
||||
:MASM
|
||||
if not exist "%UF_MASM%\ml.exe" goto Err1
|
||||
"%UF_MASM%\ml" /c /coff /nologo /Df%UF_FREQ% /D%UF_RAMP% /D%UF_MODE% /Fo ufmod.obj src\masm.asm
|
||||
goto TheEnd
|
||||
|
||||
:NASM
|
||||
if not exist "%UF_NASM%\nasmw.exe" goto Err2
|
||||
"%UF_NASM%\nasmw" -O4 -t -fwin32 -dNODEBUG -df%UF_FREQ% -d%UF_RAMP% -d%UF_MODE% -isrc\ -oufmod.obj src\nasm.asm
|
||||
goto TheEnd
|
||||
|
||||
:FASM
|
||||
if not exist "%UF_FASM%\fasm.exe" goto Err3
|
||||
echo UF_FREQ equ %UF_FREQ% >tmp.asm
|
||||
echo UF_RAMP equ %UF_RAMP% >>tmp.asm
|
||||
echo UF_MODE equ %UF_MODE% >>tmp.asm
|
||||
echo DEBUG equ 0 >>tmp.asm
|
||||
echo NOLINKER equ 0 >>tmp.asm
|
||||
echo include 'src\eff.inc' >>tmp.asm
|
||||
echo include 'src\fasm.asm' >>tmp.asm
|
||||
"%UF_FASM%\fasm" tmp.asm ufmod.obj
|
||||
del tmp.asm
|
||||
goto TheEnd
|
||||
|
||||
:Err1
|
||||
echo Couldn't find ml.exe in %UF_MASM%\
|
||||
goto TheEnd
|
||||
:Err2
|
||||
echo Couldn't find nasmw.exe in %UF_NASM%\
|
||||
goto TheEnd
|
||||
:Err3
|
||||
echo Couldn't find fasm.exe in %UF_FASM%\
|
||||
|
||||
:TheEnd
|
||||
pause
|
||||
@echo on
|
||||
cls
|
270
programs/develop/libraries/ufmod/masm.asm
Normal file
270
programs/develop/libraries/ufmod/masm.asm
Normal file
@ -0,0 +1,270 @@
|
||||
; MASM.ASM
|
||||
; --------
|
||||
; uFMOD public source code release. Provided as-is.
|
||||
|
||||
; *** This stub allows compiling uFMOD sources using MASM32.
|
||||
|
||||
.386
|
||||
.model flat
|
||||
|
||||
ifdef f44100
|
||||
FSOUND_MixRate = 44100
|
||||
FREQ_40HZ_p = 1DB8Bh
|
||||
FREQ_40HZ_f = 3B7160h
|
||||
PCM_format = 3
|
||||
else
|
||||
ifdef f22050
|
||||
FSOUND_MixRate = 22050
|
||||
FREQ_40HZ_p = 3B716h
|
||||
FREQ_40HZ_f = 76E2C0h
|
||||
PCM_format = 9
|
||||
else
|
||||
ifndef f48000
|
||||
echo UF_FREQ not specified (defaulting to 48KHz)
|
||||
endif
|
||||
FSOUND_MixRate = 48000
|
||||
FREQ_40HZ_p = 1B4E8h
|
||||
FREQ_40HZ_f = 369D00h
|
||||
PCM_format = 1
|
||||
endif
|
||||
endif
|
||||
|
||||
RAMP_NONE = 0
|
||||
RAMP_WEAK = 0
|
||||
RAMP_STRONG = 0
|
||||
ifdef NONE
|
||||
RAMP_NONE = 1
|
||||
else
|
||||
ifdef WEAK
|
||||
RAMP_WEAK = 1
|
||||
else
|
||||
ifndef STRONG
|
||||
echo UF_RAMP not specified (defaulting to STRONG)
|
||||
endif
|
||||
RAMP_STRONG = 1
|
||||
endif
|
||||
endif
|
||||
|
||||
UCODE = 0
|
||||
DEBUG = 0
|
||||
|
||||
CHK4VALIDITY = 1
|
||||
ifdef UNSAFE
|
||||
echo WARNING! Unsafe mod is ON. Library may crash while loading damaged XM tracks!
|
||||
CHK4VALIDITY = 0
|
||||
endif
|
||||
|
||||
AC97SND_ON = 0
|
||||
ifdef AC97SND
|
||||
AC97SND_ON = 1
|
||||
endif
|
||||
|
||||
include eff.inc
|
||||
|
||||
FSOUND_SAMPLE STRUC
|
||||
_length dd ?
|
||||
loopstart dd ?
|
||||
looplen dd ?
|
||||
defvol db ?
|
||||
finetune db ?
|
||||
bytes db ?
|
||||
defpan db ?
|
||||
relative db ?
|
||||
Resved db ?
|
||||
loopmode db ?
|
||||
_align db ?
|
||||
buff db ?,?
|
||||
FSOUND_SAMPLE ENDS
|
||||
|
||||
FSOUND_CHANNEL STRUC
|
||||
actualvolume dd ?
|
||||
actualpan dd ?
|
||||
fsampleoffset dd ?
|
||||
leftvolume dd ?
|
||||
rightvolume dd ?
|
||||
mixpos dd ?
|
||||
speedlo dd ?
|
||||
speedhi dd ?
|
||||
ramp_lefttarget dw ?
|
||||
ramp_righttarget dw ?
|
||||
ramp_leftspeed dd ?
|
||||
ramp_rightspeed dd ?
|
||||
fsptr dd ?
|
||||
mixposlo dd ?
|
||||
ramp_leftvolume dd ?
|
||||
ramp_rightvolume dd ?
|
||||
ramp_count dw ?
|
||||
speeddir db ?,?
|
||||
FSOUND_CHANNEL ENDS
|
||||
|
||||
FMUSIC_NOTE STRUC
|
||||
unote db ?
|
||||
number db ?
|
||||
uvolume db ?
|
||||
effect db ?
|
||||
eparam db ?
|
||||
FMUSIC_NOTE ENDS
|
||||
|
||||
FMUSIC_PATTERN STRUC
|
||||
rows dw ?
|
||||
patternsize dw ?
|
||||
data dd ?
|
||||
FMUSIC_PATTERN ENDS
|
||||
|
||||
FMUSIC_INSTRUMENT STRUC
|
||||
sample dd 16 dup (?)
|
||||
keymap db 96 dup (?)
|
||||
VOLPoints dw 24 dup (?)
|
||||
PANPoints dw 24 dup (?)
|
||||
VOLnumpoints db ?
|
||||
PANnumpoints db ?
|
||||
VOLsustain db ?
|
||||
VOLLoopStart db ?
|
||||
VOLLoopEnd db ?
|
||||
PANsustain db ?
|
||||
PANLoopStart db ?
|
||||
PANLoopEnd db ?
|
||||
VOLtype db ?
|
||||
PANtype db ?
|
||||
VIBtype db ?
|
||||
VIBsweep db ?
|
||||
iVIBdepth db ?
|
||||
VIBrate db ?
|
||||
VOLfade dw ?
|
||||
FMUSIC_INSTRUMENT ENDS
|
||||
|
||||
FMUSIC_CHANNEL STRUC
|
||||
note db ?
|
||||
samp db ?
|
||||
notectrl db ?
|
||||
inst db ?
|
||||
cptr dd ?
|
||||
freq dd ?
|
||||
volume dd ?
|
||||
voldelta dd ?
|
||||
freqdelta dd ?
|
||||
pan dd ?
|
||||
envvoltick dd ?
|
||||
envvolpos dd ?
|
||||
envvoldelta dd ?
|
||||
envpantick dd ?
|
||||
envpanpos dd ?
|
||||
envpandelta dd ?
|
||||
ivibsweeppos dd ?
|
||||
ivibpos dd ?
|
||||
keyoff db ?,?
|
||||
envvolstopped db ?
|
||||
envpanstopped db ?
|
||||
envvolfrac dd ?
|
||||
envvol dd ?
|
||||
fadeoutvol dd ?
|
||||
envpanfrac dd ?
|
||||
envpan dd ?
|
||||
period dd ?
|
||||
sampleoffset dd ?
|
||||
portatarget dd ?
|
||||
patloopno db ?,?,?,?
|
||||
patlooprow dd ?
|
||||
realnote db ?
|
||||
recenteffect db ?
|
||||
portaupdown db ?
|
||||
db ?
|
||||
xtraportadown db ?
|
||||
xtraportaup db ?
|
||||
volslide db ?
|
||||
panslide db ?
|
||||
retrigx db ?
|
||||
retrigy db ?
|
||||
portaspeed db ?
|
||||
vibpos db ?
|
||||
vibspeed db ?
|
||||
vibdepth db ?
|
||||
tremolopos db ?
|
||||
tremolospeed db ?
|
||||
tremolodepth db ?
|
||||
tremorpos db ?
|
||||
tremoron db ?
|
||||
tremoroff db ?
|
||||
wavecontrol db ?
|
||||
finevslup db ?
|
||||
fineportaup db ?
|
||||
fineportadown db ?
|
||||
FMUSIC_CHANNEL ENDS
|
||||
|
||||
FMUSIC_MODULE STRUC
|
||||
pattern dd ?
|
||||
instrument dd ?
|
||||
mixer_samplesleft dd ?
|
||||
globalvolume dd ?
|
||||
tick dd ?
|
||||
speed dd ?
|
||||
order dd ?
|
||||
row dd ?
|
||||
patterndelay dd ?
|
||||
nextorder dd ?
|
||||
nextrow dd ?
|
||||
unused1 dd ?
|
||||
numchannels dd ?
|
||||
Channels dd ?
|
||||
uFMOD_Ch dd ?
|
||||
mixer_samplespertick dd ?
|
||||
numorders dw ?
|
||||
restart dw ?
|
||||
numchannels_xm db ?
|
||||
globalvsl db ?
|
||||
numpatternsmem dw ?
|
||||
numinsts dw ?
|
||||
flags dw ?
|
||||
defaultspeed dw ?
|
||||
defaultbpm dw ?
|
||||
orderlist db 256 dup (?)
|
||||
FMUSIC_MODULE ENDS
|
||||
|
||||
FMUSIC_MODULE_size = SIZE FMUSIC_MODULE
|
||||
FSOUND_CHANNEL_size = SIZE FSOUND_CHANNEL
|
||||
FMUSIC_CHANNEL_size = SIZE FMUSIC_CHANNEL
|
||||
FMUSIC_INSTRUMENT_size = SIZE FMUSIC_INSTRUMENT
|
||||
FMUSIC_PATTERN_size = SIZE FMUSIC_PATTERN
|
||||
FMUSIC_NOTE_size = SIZE FMUSIC_NOTE
|
||||
|
||||
; FPU register stack
|
||||
st0 TEXTEQU <st(0)>
|
||||
st1 TEXTEQU <st(1)>
|
||||
|
||||
.CODE
|
||||
include ufmod.asm
|
||||
include core.asm
|
||||
|
||||
.DATA?
|
||||
_mod = $
|
||||
FMUSIC_MODULE<>
|
||||
mmt dd ?,?,?
|
||||
ufmod_heap dd ?,?
|
||||
if AC97SND_ON
|
||||
EXTERN hSound:DWORD
|
||||
dd ?
|
||||
else
|
||||
hSound dd ?
|
||||
endif
|
||||
hBuff dd ?
|
||||
SW_Exit dd ?
|
||||
MixBuf db FSOUND_BlockSize*8 dup (?)
|
||||
ufmod_noloop db ?
|
||||
ufmod_pause_ db ?
|
||||
mix_endflag db ?,?
|
||||
mmf dd ?,?,?,?
|
||||
ufmod_vol dd ?
|
||||
uFMOD_fopen dd ?
|
||||
uFMOD_fread dd ?
|
||||
file_struct dd 7 dup (?)
|
||||
cache_offset dd ?
|
||||
if INFO_API_ON
|
||||
time_ms dd ?
|
||||
L_vol dw ?
|
||||
R_vol dw ?
|
||||
s_row dw ?
|
||||
s_order dw ?
|
||||
szTtl db 24 dup (?)
|
||||
endif
|
||||
DummySamp FSOUND_SAMPLE<>
|
||||
end
|
BIN
programs/develop/libraries/ufmod/media/BLITZXMK.XM
Normal file
BIN
programs/develop/libraries/ufmod/media/BLITZXMK.XM
Normal file
Binary file not shown.
60
programs/develop/libraries/ufmod/media/blitz.eff.inc
Normal file
60
programs/develop/libraries/ufmod/media/blitz.eff.inc
Normal file
@ -0,0 +1,60 @@
|
||||
; XM-file: BLITZXMK.XM
|
||||
|
||||
; uFMOD optional features:
|
||||
INFO_API_ON equ 0 ; disable InfoAPI
|
||||
NOLOOP_ON equ 0 ; disable XM_NOLOOP
|
||||
PAUSE_RESUME_ON equ 1 ; enable pause/resume and XM_SUSPENDED
|
||||
VOL_CONTROL_ON equ 0 ; disable volume control
|
||||
JUMP_TO_PAT_ON equ 1 ; enable Jump2Pattern
|
||||
XM_FILE_ON equ 0 ; disable file loading
|
||||
|
||||
; Special flags:
|
||||
INSTRUMENTVIBRATO_ON equ 1
|
||||
VOLUMEENVELOPE_ON equ 1
|
||||
PANENVELOPE_ON equ 0
|
||||
VOLUMEBYTE_ON equ 1
|
||||
ADPCM_ON equ 0
|
||||
AMIGAPERIODS_ON equ 0
|
||||
|
||||
; XM effects:
|
||||
ARPEGGIO_ON equ 0
|
||||
PORTAUP_ON equ 0
|
||||
PORTADOWN_ON equ 0
|
||||
PORTATO_ON equ 1
|
||||
VIBRATO_ON equ 1
|
||||
PORTATOVOLSLIDE_ON equ 0
|
||||
VIBRATOVOLSLIDE_ON equ 0
|
||||
TREMOLO_ON equ 0
|
||||
SETPANPOSITION_ON equ 0
|
||||
SETSAMPLEOFFSET_ON equ 0
|
||||
VOLUMESLIDE_ON equ 0
|
||||
PATTERNJUMP_ON equ 1
|
||||
SETVOLUME_ON equ 0
|
||||
PATTERNBREAK_ON equ 0
|
||||
SETSPEED_ON equ 1
|
||||
SETGLOBALVOLUME_ON equ 0
|
||||
GLOBALVOLSLIDE_ON equ 0
|
||||
KEYOFF_ON equ 0
|
||||
SETENVELOPEPOS_ON equ 0
|
||||
PANSLIDE_ON equ 0
|
||||
MULTIRETRIG_ON equ 0
|
||||
TREMOR_ON equ 0
|
||||
EXTRAFINEPORTA_ON equ 0
|
||||
FINEPORTAUP_ON equ 0
|
||||
FINEPORTADOWN_ON equ 0
|
||||
SETVIBRATOWAVE_ON equ 0
|
||||
SETFINETUNE_ON equ 0
|
||||
PATTERNLOOP_ON equ 0
|
||||
SETTREMOLOWAVE_ON equ 0
|
||||
SETPANPOSITION16_ON equ 0
|
||||
RETRIG_ON equ 0
|
||||
NOTECUT_ON equ 1
|
||||
NOTEDELAY_ON equ 1
|
||||
PATTERNDELAY_ON equ 0
|
||||
PORTAUP_OR_DOWN_ON equ 0
|
||||
VIBRATO_OR_VOLSLIDE equ 1
|
||||
VIBRATO_OR_TREMOLO equ 1
|
||||
PORTATO_OR_VOLSLIDE equ 1
|
||||
VOLUME_OR_PANENVELOPE equ 1
|
||||
ROWCOMMANDS_ON equ 1
|
||||
FINEVOLUMESLIDE_ON equ 0
|
60
programs/develop/libraries/ufmod/media/mini.eff.inc
Normal file
60
programs/develop/libraries/ufmod/media/mini.eff.inc
Normal file
@ -0,0 +1,60 @@
|
||||
; XM-file: mini.xm
|
||||
|
||||
; uFMOD optional features:
|
||||
INFO_API_ON equ 0 ; disable InfoAPI
|
||||
NOLOOP_ON equ 0 ; disable XM_NOLOOP
|
||||
PAUSE_RESUME_ON equ 0 ; disable pause/resume and XM_SUSPENDED
|
||||
VOL_CONTROL_ON equ 0 ; disable volume control
|
||||
JUMP_TO_PAT_ON equ 0 ; disable Jump2Pattern
|
||||
XM_FILE_ON equ 0 ; disable file loading
|
||||
|
||||
; Special flags:
|
||||
INSTRUMENTVIBRATO_ON equ 0
|
||||
VOLUMEENVELOPE_ON equ 1
|
||||
PANENVELOPE_ON equ 0
|
||||
VOLUMEBYTE_ON equ 0
|
||||
ADPCM_ON equ 0
|
||||
AMIGAPERIODS_ON equ 0
|
||||
|
||||
; XM effects:
|
||||
ARPEGGIO_ON equ 0
|
||||
PORTAUP_ON equ 0
|
||||
PORTADOWN_ON equ 0
|
||||
PORTATO_ON equ 0
|
||||
VIBRATO_ON equ 0
|
||||
PORTATOVOLSLIDE_ON equ 0
|
||||
VIBRATOVOLSLIDE_ON equ 0
|
||||
TREMOLO_ON equ 0
|
||||
SETPANPOSITION_ON equ 0
|
||||
SETSAMPLEOFFSET_ON equ 0
|
||||
VOLUMESLIDE_ON equ 1
|
||||
PATTERNJUMP_ON equ 0
|
||||
SETVOLUME_ON equ 0
|
||||
PATTERNBREAK_ON equ 0
|
||||
SETSPEED_ON equ 0
|
||||
SETGLOBALVOLUME_ON equ 0
|
||||
GLOBALVOLSLIDE_ON equ 0
|
||||
KEYOFF_ON equ 0
|
||||
SETENVELOPEPOS_ON equ 0
|
||||
PANSLIDE_ON equ 0
|
||||
MULTIRETRIG_ON equ 0
|
||||
TREMOR_ON equ 0
|
||||
EXTRAFINEPORTA_ON equ 0
|
||||
FINEPORTAUP_ON equ 0
|
||||
FINEPORTADOWN_ON equ 0
|
||||
SETVIBRATOWAVE_ON equ 0
|
||||
SETFINETUNE_ON equ 0
|
||||
PATTERNLOOP_ON equ 1
|
||||
SETTREMOLOWAVE_ON equ 0
|
||||
SETPANPOSITION16_ON equ 0
|
||||
RETRIG_ON equ 0
|
||||
NOTECUT_ON equ 0
|
||||
NOTEDELAY_ON equ 0
|
||||
PATTERNDELAY_ON equ 0
|
||||
PORTAUP_OR_DOWN_ON equ 0
|
||||
VIBRATO_OR_VOLSLIDE equ 0
|
||||
VIBRATO_OR_TREMOLO equ 0
|
||||
PORTATO_OR_VOLSLIDE equ 0
|
||||
VOLUME_OR_PANENVELOPE equ 1
|
||||
ROWCOMMANDS_ON equ 1
|
||||
FINEVOLUMESLIDE_ON equ 0
|
BIN
programs/develop/libraries/ufmod/media/mini.xm
Normal file
BIN
programs/develop/libraries/ufmod/media/mini.xm
Normal file
Binary file not shown.
278
programs/develop/libraries/ufmod/nasm.asm
Normal file
278
programs/develop/libraries/ufmod/nasm.asm
Normal file
@ -0,0 +1,278 @@
|
||||
; NASM.ASM
|
||||
; --------
|
||||
; uFMOD public source code release. Provided as-is.
|
||||
|
||||
; *** This stub allows compiling uFMOD sources using NASM.
|
||||
; Everything documented in fasm stub!
|
||||
|
||||
; %error directive in NASM causes multiple prompts to appear due to
|
||||
; multiple passes :( So, we'd better avoid using %error.
|
||||
|
||||
ifdef f44100
|
||||
FSOUND_MixRate equ 44100
|
||||
FREQ_40HZ_p equ 1DB8Bh
|
||||
FREQ_40HZ_f equ 3B7160h
|
||||
PCM_format equ 3
|
||||
else
|
||||
ifdef f22050
|
||||
FSOUND_MixRate equ 22050
|
||||
FREQ_40HZ_p equ 3B716h
|
||||
FREQ_40HZ_f equ 76E2C0h
|
||||
PCM_format equ 9
|
||||
else
|
||||
FSOUND_MixRate equ 48000
|
||||
FREQ_40HZ_p equ 1B4E8h
|
||||
FREQ_40HZ_f equ 369D00h
|
||||
PCM_format equ 1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef NONE
|
||||
RAMP_NONE equ 1
|
||||
RAMP_WEAK equ 0
|
||||
RAMP_STRONG equ 0
|
||||
else
|
||||
ifdef WEAK
|
||||
RAMP_NONE equ 0
|
||||
RAMP_WEAK equ 1
|
||||
RAMP_STRONG equ 0
|
||||
else
|
||||
RAMP_NONE equ 0
|
||||
RAMP_WEAK equ 0
|
||||
RAMP_STRONG equ 1
|
||||
endif
|
||||
endif
|
||||
|
||||
UCODE equ 0
|
||||
|
||||
ifdef NODEBUG
|
||||
DEBUG equ 0
|
||||
else
|
||||
DEBUG equ 1
|
||||
endif
|
||||
|
||||
ifdef UNSAFE
|
||||
CHK4VALIDITY equ 0
|
||||
AC97SND_ON equ 0
|
||||
else
|
||||
CHK4VALIDITY equ 1
|
||||
ifdef AC97SND
|
||||
AC97SND_ON equ 1
|
||||
else
|
||||
AC97SND_ON equ 0
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef NOLINKER
|
||||
%include "eff.inc"
|
||||
|
||||
[segment .text align=4]
|
||||
endif
|
||||
|
||||
STRUC FSOUND_SAMPLE
|
||||
FSOUND_SAMPLE._length resd 1
|
||||
FSOUND_SAMPLE.loopstart resd 1
|
||||
FSOUND_SAMPLE.looplen resd 1
|
||||
FSOUND_SAMPLE.defvol resb 1
|
||||
FSOUND_SAMPLE.finetune resb 1
|
||||
FSOUND_SAMPLE.bytes resb 1
|
||||
FSOUND_SAMPLE.defpan resb 1
|
||||
FSOUND_SAMPLE.relative resb 1
|
||||
FSOUND_SAMPLE.Resved resb 1
|
||||
FSOUND_SAMPLE.loopmode resb 1
|
||||
FSOUND_SAMPLE._align resb 1
|
||||
FSOUND_SAMPLE.buff resb 2
|
||||
ENDSTRUC
|
||||
|
||||
STRUC FSOUND_CHANNEL
|
||||
FSOUND_CHANNEL.actualvolume resd 1
|
||||
FSOUND_CHANNEL.actualpan resd 1
|
||||
FSOUND_CHANNEL.fsampleoffset resd 1
|
||||
FSOUND_CHANNEL.leftvolume resd 1
|
||||
FSOUND_CHANNEL.rightvolume resd 1
|
||||
FSOUND_CHANNEL.mixpos resd 1
|
||||
FSOUND_CHANNEL.speedlo resd 1
|
||||
FSOUND_CHANNEL.speedhi resd 1
|
||||
FSOUND_CHANNEL.ramp_lefttarget resw 1
|
||||
FSOUND_CHANNEL.ramp_righttarget resw 1
|
||||
FSOUND_CHANNEL.ramp_leftspeed resd 1
|
||||
FSOUND_CHANNEL.ramp_rightspeed resd 1
|
||||
FSOUND_CHANNEL.fsptr resd 1
|
||||
FSOUND_CHANNEL.mixposlo resd 1
|
||||
FSOUND_CHANNEL.ramp_leftvolume resd 1
|
||||
FSOUND_CHANNEL.ramp_rightvolume resd 1
|
||||
FSOUND_CHANNEL.ramp_count resw 1
|
||||
FSOUND_CHANNEL.speeddir resb 2
|
||||
ENDSTRUC
|
||||
|
||||
STRUC FMUSIC_NOTE
|
||||
FMUSIC_NOTE.unote resb 1
|
||||
FMUSIC_NOTE.number resb 1
|
||||
FMUSIC_NOTE.uvolume resb 1
|
||||
FMUSIC_NOTE.effect resb 1
|
||||
FMUSIC_NOTE.eparam resb 1
|
||||
ENDSTRUC
|
||||
|
||||
STRUC FMUSIC_PATTERN
|
||||
FMUSIC_PATTERN.rows resw 1
|
||||
FMUSIC_PATTERN.patternsize resw 1
|
||||
FMUSIC_PATTERN.data resd 1
|
||||
ENDSTRUC
|
||||
|
||||
STRUC FMUSIC_INSTRUMENT
|
||||
FMUSIC_INSTRUMENT.sample resd 16
|
||||
FMUSIC_INSTRUMENT.keymap resb 96
|
||||
FMUSIC_INSTRUMENT.VOLPoints resw 24
|
||||
FMUSIC_INSTRUMENT.PANPoints resw 24
|
||||
FMUSIC_INSTRUMENT.VOLnumpoints resb 1
|
||||
FMUSIC_INSTRUMENT.PANnumpoints resb 1
|
||||
FMUSIC_INSTRUMENT.VOLsustain resb 1
|
||||
FMUSIC_INSTRUMENT.VOLLoopStart resb 1
|
||||
FMUSIC_INSTRUMENT.VOLLoopEnd resb 1
|
||||
FMUSIC_INSTRUMENT.PANsustain resb 1
|
||||
FMUSIC_INSTRUMENT.PANLoopStart resb 1
|
||||
FMUSIC_INSTRUMENT.PANLoopEnd resb 1
|
||||
FMUSIC_INSTRUMENT.VOLtype resb 1
|
||||
FMUSIC_INSTRUMENT.PANtype resb 1
|
||||
FMUSIC_INSTRUMENT.VIBtype resb 1
|
||||
FMUSIC_INSTRUMENT.VIBsweep resb 1
|
||||
FMUSIC_INSTRUMENT.iVIBdepth resb 1
|
||||
FMUSIC_INSTRUMENT.VIBrate resb 1
|
||||
FMUSIC_INSTRUMENT.VOLfade resw 1
|
||||
ENDSTRUC
|
||||
|
||||
STRUC FMUSIC_CHANNEL
|
||||
FMUSIC_CHANNEL.note resb 1
|
||||
FMUSIC_CHANNEL.samp resb 1
|
||||
FMUSIC_CHANNEL.notectrl resb 1
|
||||
FMUSIC_CHANNEL.inst resb 1
|
||||
FMUSIC_CHANNEL.cptr resd 1
|
||||
FMUSIC_CHANNEL.freq resd 1
|
||||
FMUSIC_CHANNEL.volume resd 1
|
||||
FMUSIC_CHANNEL.voldelta resd 1
|
||||
FMUSIC_CHANNEL.freqdelta resd 1
|
||||
FMUSIC_CHANNEL.pan resd 1
|
||||
FMUSIC_CHANNEL.envvoltick resd 1
|
||||
FMUSIC_CHANNEL.envvolpos resd 1
|
||||
FMUSIC_CHANNEL.envvoldelta resd 1
|
||||
FMUSIC_CHANNEL.envpantick resd 1
|
||||
FMUSIC_CHANNEL.envpanpos resd 1
|
||||
FMUSIC_CHANNEL.envpandelta resd 1
|
||||
FMUSIC_CHANNEL.ivibsweeppos resd 1
|
||||
FMUSIC_CHANNEL.ivibpos resd 1
|
||||
FMUSIC_CHANNEL.keyoff resb 2
|
||||
FMUSIC_CHANNEL.envvolstopped resb 1
|
||||
FMUSIC_CHANNEL.envpanstopped resb 1
|
||||
FMUSIC_CHANNEL.envvolfrac resd 1
|
||||
FMUSIC_CHANNEL.envvol resd 1
|
||||
FMUSIC_CHANNEL.fadeoutvol resd 1
|
||||
FMUSIC_CHANNEL.envpanfrac resd 1
|
||||
FMUSIC_CHANNEL.envpan resd 1
|
||||
FMUSIC_CHANNEL.period resd 1
|
||||
FMUSIC_CHANNEL.sampleoffset resd 1
|
||||
FMUSIC_CHANNEL.portatarget resd 1
|
||||
FMUSIC_CHANNEL.patloopno resb 4
|
||||
FMUSIC_CHANNEL.patlooprow resd 1
|
||||
FMUSIC_CHANNEL.realnote resb 1
|
||||
FMUSIC_CHANNEL.recenteffect resb 1
|
||||
FMUSIC_CHANNEL.portaupdown resb 2
|
||||
FMUSIC_CHANNEL.xtraportadown resb 1
|
||||
FMUSIC_CHANNEL.xtraportaup resb 1
|
||||
FMUSIC_CHANNEL.volslide resb 1
|
||||
FMUSIC_CHANNEL.panslide resb 1
|
||||
FMUSIC_CHANNEL.retrigx resb 1
|
||||
FMUSIC_CHANNEL.retrigy resb 1
|
||||
FMUSIC_CHANNEL.portaspeed resb 1
|
||||
FMUSIC_CHANNEL.vibpos resb 1
|
||||
FMUSIC_CHANNEL.vibspeed resb 1
|
||||
FMUSIC_CHANNEL.vibdepth resb 1
|
||||
FMUSIC_CHANNEL.tremolopos resb 1
|
||||
FMUSIC_CHANNEL.tremolospeed resb 1
|
||||
FMUSIC_CHANNEL.tremolodepth resb 1
|
||||
FMUSIC_CHANNEL.tremorpos resb 1
|
||||
FMUSIC_CHANNEL.tremoron resb 1
|
||||
FMUSIC_CHANNEL.tremoroff resb 1
|
||||
FMUSIC_CHANNEL.wavecontrol resb 1
|
||||
FMUSIC_CHANNEL.finevslup resb 1
|
||||
FMUSIC_CHANNEL.fineportaup resb 1
|
||||
FMUSIC_CHANNEL.fineportadown resb 1
|
||||
ENDSTRUC
|
||||
|
||||
STRUC FMUSIC_MODULE
|
||||
FMUSIC_MODULE.pattern resd 1
|
||||
FMUSIC_MODULE.instrument resd 1
|
||||
FMUSIC_MODULE.mixer_samplesleft resd 1
|
||||
FMUSIC_MODULE.globalvolume resd 1
|
||||
FMUSIC_MODULE.tick resd 1
|
||||
FMUSIC_MODULE.speed resd 1
|
||||
FMUSIC_MODULE.order resd 1
|
||||
FMUSIC_MODULE.row resd 1
|
||||
FMUSIC_MODULE.patterndelay resd 1
|
||||
FMUSIC_MODULE.nextorder resd 1
|
||||
FMUSIC_MODULE.nextrow resd 1
|
||||
FMUSIC_MODULE.unused1 resd 1
|
||||
FMUSIC_MODULE.numchannels resd 1
|
||||
FMUSIC_MODULE.Channels resd 1
|
||||
FMUSIC_MODULE.uFMOD_Ch resd 1
|
||||
FMUSIC_MODULE.mixer_samplespertick resd 1
|
||||
FMUSIC_MODULE.numorders resw 1
|
||||
FMUSIC_MODULE.restart resw 1
|
||||
FMUSIC_MODULE.numchannels_xm resb 1
|
||||
FMUSIC_MODULE.globalvsl resb 1
|
||||
FMUSIC_MODULE.numpatternsmem resw 1
|
||||
FMUSIC_MODULE.numinsts resw 1
|
||||
FMUSIC_MODULE.flags resw 1
|
||||
FMUSIC_MODULE.defaultspeed resw 1
|
||||
FMUSIC_MODULE.defaultbpm resw 1
|
||||
FMUSIC_MODULE.orderlist resb 256
|
||||
ENDSTRUC
|
||||
|
||||
%macro PUBLIC 1
|
||||
ifndef NOLINKER
|
||||
GLOBAL %1
|
||||
endif
|
||||
%endmacro
|
||||
%define OFFSET
|
||||
%define PTR
|
||||
|
||||
include "ufmod.asm"
|
||||
include "core.asm"
|
||||
|
||||
ifdef NOLINKER
|
||||
uFMOD_IMG_END: ; End of uFMOD's code. BSS follows.
|
||||
align 16
|
||||
[segment .bss]
|
||||
else
|
||||
[segment .bss align=16]
|
||||
endif
|
||||
|
||||
_mod resb FMUSIC_MODULE_size
|
||||
mmt resd 3
|
||||
ufmod_heap resd 2
|
||||
if AC97SND_ON
|
||||
extern hSound
|
||||
resd 1
|
||||
else
|
||||
hSound resd 1
|
||||
endif
|
||||
hBuff resd 1
|
||||
SW_Exit resd 1
|
||||
MixBuf resb FSOUND_BlockSize*8
|
||||
ufmod_noloop resb 1
|
||||
ufmod_pause_ resb 1
|
||||
mix_endflag resb 2
|
||||
mmf resd 4
|
||||
ufmod_vol resd 1
|
||||
uFMOD_fopen resd 1
|
||||
uFMOD_fread resd 1
|
||||
file_struct resd 7
|
||||
cache_offset resd 1
|
||||
if INFO_API_ON
|
||||
time_ms resd 1
|
||||
L_vol resw 1
|
||||
R_vol resw 1
|
||||
s_row resw 1
|
||||
s_order resw 1
|
||||
szTtl resb 24
|
||||
endif
|
||||
DummySamp resb FSOUND_SAMPLE_size
|
33
programs/develop/libraries/ufmod/readme_en.htm
Normal file
33
programs/develop/libraries/ufmod/readme_en.htm
Normal file
File diff suppressed because one or more lines are too long
34
programs/develop/libraries/ufmod/readme_es.htm
Normal file
34
programs/develop/libraries/ufmod/readme_es.htm
Normal file
File diff suppressed because one or more lines are too long
33
programs/develop/libraries/ufmod/readme_ru.htm
Normal file
33
programs/develop/libraries/ufmod/readme_ru.htm
Normal file
File diff suppressed because one or more lines are too long
89
programs/develop/libraries/ufmod/ufmod-codec.h
Normal file
89
programs/develop/libraries/ufmod/ufmod-codec.h
Normal file
@ -0,0 +1,89 @@
|
||||
/*
|
||||
uFMOD API reference (AC97SND mode)
|
||||
=========================================================
|
||||
|
||||
NOTE: ufmod.obj should be rebuilt setting UF_MODE=AC97SND
|
||||
in order to make it usable in AC97SND player.
|
||||
|
||||
The Infinity Sound driver handle should be available as
|
||||
a public symbol named hSound. It is so when using Serge's
|
||||
sound.lib.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* HANDLE uFMOD_LoadSong(char *lpXM);
|
||||
---
|
||||
Description:
|
||||
---
|
||||
Loads the given XM song and starts playing it as soon as you
|
||||
call uFMOD_WaveOut for the first time. It will stop any
|
||||
currently playing song before loading the new one. Heap should
|
||||
be initialized before calling this function!
|
||||
---
|
||||
Parameters:
|
||||
---
|
||||
lpXM
|
||||
Specifies the filename of the song to load.
|
||||
---
|
||||
Return Values:
|
||||
---
|
||||
On success, returns a non zero value. Returns 0 on failure.
|
||||
*/
|
||||
int __cdecl uFMOD_LoadSong(char*);
|
||||
|
||||
/* int uFMOD_WaveOut(SNDBUF hBuff)
|
||||
---
|
||||
Description:
|
||||
---
|
||||
Updates the internal playback buffer.
|
||||
---
|
||||
Parameters:
|
||||
---
|
||||
hBuff
|
||||
The Infinity Sound buffer to update.
|
||||
---
|
||||
Remarks:
|
||||
---
|
||||
Playback doesn't actually begin when calling uFMOD_LoadSong,
|
||||
but when calling uFMOD_WaveOut after a successful uFMOD_LoadSong
|
||||
call. Afterwards, you should call uFMOD_WaveOut repeatedly at
|
||||
least once every 250 ms to prevent "buffer underruns".
|
||||
uFMOD_WaveOut is a non-blocking function.
|
||||
---
|
||||
Return Values:
|
||||
---
|
||||
Returns non zero on error.
|
||||
*/
|
||||
int __cdecl uFMOD_WaveOut(unsigned int);
|
||||
|
||||
/* void uFMOD_StopSong(void)
|
||||
---
|
||||
Description:
|
||||
---
|
||||
Stops the currently playing song, freeing the associated
|
||||
resources.
|
||||
---
|
||||
Remarks:
|
||||
---
|
||||
Does nothing if no song is playing at the time the call is made.
|
||||
*/
|
||||
void __cdecl uFMOD_StopSong();
|
||||
|
||||
/* unsigned char* _uFMOD_GetTitle(void)
|
||||
---
|
||||
Description:
|
||||
---
|
||||
Returns the current song's title.
|
||||
---
|
||||
Remarks:
|
||||
---
|
||||
Not every song has a title, so be prepared to get an empty string.
|
||||
*/
|
||||
unsigned char* __cdecl uFMOD_GetTitle();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
1104
programs/develop/libraries/ufmod/ufmod.asm
Normal file
1104
programs/develop/libraries/ufmod/ufmod.asm
Normal file
File diff suppressed because it is too large
Load Diff
253
programs/develop/libraries/ufmod/ufmod.inc
Normal file
253
programs/develop/libraries/ufmod/ufmod.inc
Normal file
@ -0,0 +1,253 @@
|
||||
; uFMOD API reference (NORMAL/UNSAFE mode)
|
||||
; ====================================================================
|
||||
|
||||
; NOTE: All functions follow the cdecl calling convention!
|
||||
; _uFMOD_LoadSong
|
||||
; _uFMOD_WaveOut
|
||||
; _uFMOD_StopSong
|
||||
; _uFMOD_Jump2Pattern
|
||||
; _uFMOD_Pause
|
||||
; _uFMOD_Resume
|
||||
; _uFMOD_GetStats
|
||||
; _uFMOD_GetRowOrder
|
||||
; _uFMOD_GetTime
|
||||
; _uFMOD_GetTitle
|
||||
; _uFMOD_SetVolume
|
||||
|
||||
; ====================================================================
|
||||
; HANDLE _uFMOD_LoadSong(
|
||||
; void *lpXM,
|
||||
; void *param,
|
||||
; int fdwSong
|
||||
; )
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Loads the given XM song and starts playing it as soon as you
|
||||
; call _uFMOD_WaveOut for the first time. Playback won't begin
|
||||
; if XM_SUSPENDED flag is specified. It will stop any currently
|
||||
; playing song before loading the new one.
|
||||
; ---
|
||||
; Parameters:
|
||||
; ---
|
||||
; lpXM
|
||||
; Specifies the song to load. If this parameter is 0, any
|
||||
; currently playing song is stopped. In such a case, function
|
||||
; does not return a meaningful value. fdwSong parameter
|
||||
; determines whether this value is interpreted as a filename
|
||||
; or as a pointer to an image of the song in memory.
|
||||
; param
|
||||
; If XM_MEMORY is specified, this parameter should be the size
|
||||
; of the image of the song in memory.
|
||||
; If XM_FILE is specified, this parameter is ignored.
|
||||
; fdwSong
|
||||
; Flags for playing the song. The following values are defined:
|
||||
; XM_FILE lpXM points to filename. param is ignored.
|
||||
; XM_MEMORY lpXM points to an image of a song in memory.
|
||||
; param is the image size. Once, _uFMOD_LoadSong
|
||||
; returns, it's safe to free/discard the memory
|
||||
; buffer.
|
||||
; XM_NOLOOP An XM track plays repeatedly by default. Specify
|
||||
; this flag to play it only once.
|
||||
; XM_SUSPENDED The XM track is loaded in a suspended state,
|
||||
; and will not play until the _uFMOD_Resume function
|
||||
; is called. This is useful for preloading a song
|
||||
; or testing an XM track for validity.
|
||||
; ---
|
||||
; Return Values:
|
||||
; ---
|
||||
; On success, returns the handle of the Infinity Sound driver.
|
||||
; Returns 0 on failure.
|
||||
|
||||
; ====================================================================
|
||||
; int _uFMOD_WaveOut(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Updates the internal playback buffer.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function should be called from the same thread
|
||||
; _uFMOD_LoadSong was previously called. Playback doesn't actually
|
||||
; begin when calling _uFMOD_LoadSong, but when calling _uFMOD_WaveOut
|
||||
; after a successful _uFMOD_LoadSong call. Afterwards, you should
|
||||
; call _uFMOD_WaveOut repeatedly at least once every 250 ms to
|
||||
; prevent "buffer underruns".
|
||||
; _uFMOD_WaveOut is a non-blocking function. The accuracy of the
|
||||
; InfoAPI functions (_uFMOD_GetStats, _uFMOD_GetRowOrder and
|
||||
; _uFMOD_GetTime) depends on the periodicity of this function being
|
||||
; invoked.
|
||||
; ---
|
||||
; Return Values:
|
||||
; ---
|
||||
; Returns non zero on error.
|
||||
|
||||
; ====================================================================
|
||||
; void _uFMOD_StopSong(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Stops the currently playing song, freeing the associated
|
||||
; resources.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; Does nothing if no song is playing at the time the call is made.
|
||||
|
||||
; ====================================================================
|
||||
; void _uFMOD_Jump2Pattern(
|
||||
; unsigned int pat
|
||||
; )
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Jumps to the specified pattern index.
|
||||
; ---
|
||||
; Parameters:
|
||||
; ---
|
||||
; pat
|
||||
; Next zero based pattern index.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; uFMOD doesn't automatically perform Note Off effects before jumping
|
||||
; to the target pattern. In other words, the original pattern will
|
||||
; remain in the mixer until it fades out. You can use this feature to
|
||||
; your advantage. If you don't like it, just insert leading Note Off
|
||||
; commands in all patterns intended to be used as _uFMOD_Jump2Pattern
|
||||
; targets.
|
||||
; if the pattern index lays outside of the bounds of the pattern order
|
||||
; table, calling this function jumps to pattern 0, effectively
|
||||
; rewinding playback.
|
||||
|
||||
; ====================================================================
|
||||
; void _uFMOD_Pause(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Pauses the currently playing song, if any.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; While paused you can still control the volume (_uFMOD_SetVolume) and
|
||||
; the pattern order (_uFMOD_Jump2Pattern). The RMS volume coefficients
|
||||
; (_uFMOD_GetStats) will go down to 0 and the progress tracker
|
||||
; (_uFMOD_GetTime) will "freeze" while the song is paused.
|
||||
; _uFMOD_Pause doesn't perform the request immediately. Instead, it
|
||||
; signals to pause when playback reaches next chunk of data.
|
||||
; This way, _uFMOD_Pause performs asynchronously and returns very fast.
|
||||
; It is not cumulative. So, calling _uFMOD_Pause many times in a row
|
||||
; has the same effect as calling it once.
|
||||
; You shouldn't stop calling _uFMOD_WaveOut while the song is paused!
|
||||
|
||||
; ====================================================================
|
||||
; void _uFMOD_Resume(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Resumes the currently paused song, if any.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; _uFMOD_Resume doesn't perform the request immediately. Instead, it
|
||||
; signals to resume when _uFMOD_WaveOut is called again. _uFMOD_Resume
|
||||
; is not cumulative. So, calling it many times in a row has the same
|
||||
; effect as calling it once.
|
||||
|
||||
; ====================================================================
|
||||
; unsigned int _uFMOD_GetStats(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the current RMS volume coefficients in (L)eft and (R)ight
|
||||
; channels.
|
||||
; low-order word: RMS volume in R channel
|
||||
; hi-order word: RMS volume in L channel
|
||||
; Range from 0 (silence) to $7FFF (maximum) on each channel.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function is useful for updating a VU meter. It's recommended
|
||||
; to rescale the output to log10 (decibels or dB for short), because
|
||||
; human ears track volume changes in a dB scale. You may call
|
||||
; _uFMOD_GetStats() as often as you like, but take in mind that uFMOD
|
||||
; updates both channel RMS volumes at the same rate _uFMOD_WaveOut
|
||||
; function is called. In other words, you should call _uFMOD_WaveOut
|
||||
; more often to increase the accuracy of _uFMOD_GetStats.
|
||||
|
||||
; ====================================================================
|
||||
; unsigned int _uFMOD_GetRowOrder(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the currently playing row and order.
|
||||
; low-order word: row
|
||||
; hi-order word: order
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function is useful for synchronization. uFMOD updates both
|
||||
; row and order values at the same rate _uFMOD_WaveOut function is
|
||||
; called. In other words, you should call _uFMOD_WaveOut more often
|
||||
; to increase the accuracy of _uFMOD_GetRowOrder.
|
||||
|
||||
; ====================================================================
|
||||
; unsigned int _uFMOD_GetTime(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the time in milliseconds since the song was started.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; This function is useful for synchronizing purposes. Multimedia
|
||||
; applications can use _uFMOD_GetTime to synchronize GFX to sound,
|
||||
; for example. An XM player can use this function to update a progress
|
||||
; meter.
|
||||
|
||||
; ====================================================================
|
||||
; unsigned char* _uFMOD_GetTitle(void)
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Returns the current song's title.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; Not every song has a title, so be prepared to get an empty string.
|
||||
|
||||
; ====================================================================
|
||||
; void _uFMOD_SetVolume(
|
||||
; unsigned int vol
|
||||
; )
|
||||
; ---
|
||||
; Description:
|
||||
; ---
|
||||
; Sets the global volume. The volume scale is linear.
|
||||
; ---
|
||||
; Parameters:
|
||||
; ---
|
||||
; vol
|
||||
; New volume. Range: from uFMOD_MIN_VOL (muting) to uFMOD_MAX_VOL
|
||||
; (maximum volume). Any value above uFMOD_MAX_VOL maps to maximum
|
||||
; volume.
|
||||
; ---
|
||||
; Remarks:
|
||||
; ---
|
||||
; uFMOD internally converts the given values to a logarithmic scale (dB).
|
||||
; Maximum volume is set by default. The volume value is preserved across
|
||||
; _uFMOD_LoadSong calls. You can set the desired volume level before
|
||||
; actually starting to play a song.
|
||||
; You can use Infinity Sound API to control the L and R channels volumes
|
||||
; separately. It also has a wider range than _uFMOD_SetVolume, sometimes
|
||||
; allowing to amplify the sound volume as well, as opposed to
|
||||
; _uFMOD_SetVolume only being able to attenuate it.
|
||||
|
||||
XM_MEMORY equ 1
|
||||
XM_FILE equ 2
|
||||
XM_NOLOOP equ 8
|
||||
XM_SUSPENDED equ 16
|
||||
uFMOD_MIN_VOL equ 0
|
||||
uFMOD_MAX_VOL equ 25
|
||||
uFMOD_DEFAULT_VOL equ 25
|
Loading…
Reference in New Issue
Block a user