test_music.c
5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*************************************************************
test_music.c : Nintendo 64 Music Tools Library Sample
(c) Copyright 1998, Software Creations (Holdings) Ltd.
Version 3.11
EFFECTS demo main source file. This demo illustrates how to
use sound effects from different sound effect banks.
**************************************************************/
/* include system header files */
#ifndef F3DEX_GBI
#define F3DEX_GBI
#endif
#include <ultra64.h>
#include <libmus.h>
#include <libmus_data.h>
/* include current header file */
#include "test_rom.h"
/* internal function prototypes */
static void DmaRomToRam(void *rom, void *ram, int len);
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
[GLOBAL FUNCTION]
InitMusicDriver()
[Explantion]
Download ROM files and initialise the music player.
[Return value]
NONE
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/* ROM addresses */
#define WBANK1_START _wbank1SegmentRomStart
#define PBANK1_START _pbank1SegmentRomStart
#define PBANK1_END _pbank1SegmentRomEnd
#define WBANK2_START _wbank2SegmentRomStart
#define PBANK2_START _pbank2SegmentRomStart
#define PBANK2_END _pbank2SegmentRomEnd
#define WBANK3_START _wbank3SegmentRomStart
#define PBANK3_START _pbank3SegmentRomStart
#define PBANK3_END _pbank3SegmentRomEnd
#define MUSIC_START _tuneSegmentRomStart
#define MUSIC_END _tuneSegmentRomEnd
#define EFFECT1_START _effect0SegmentRomStart
#define EFFECT1_END _effect0SegmentRomEnd
#define EFFECT2_START _effect1SegmentRomStart
#define EFFECT2_END _effect1SegmentRomEnd
#define EFFECT3_START _effect2SegmentRomStart
#define EFFECT3_END _effect2SegmentRomEnd
extern char WBANK1_START[];
extern char PBANK1_START[];
extern char PBANK1_END[];
extern char WBANK2_START[];
extern char PBANK2_START[];
extern char PBANK2_END[];
extern char WBANK3_START[];
extern char PBANK3_START[];
extern char PBANK3_END[];
extern char MUSIC_START[];
extern char MUSIC_END[];
extern char EFFECT1_START[];
extern char EFFECT1_END[];
extern char EFFECT2_START[];
extern char EFFECT2_END[];
extern char EFFECT3_START[];
extern char EFFECT3_END[];
/* permanent RAM buffers */
#define AUDIO_HEAP_SIZE 300000
#define PBANK_SIZE 10000
#define TUNE_SIZE 8000
#define EFFECT_SIZE 1024
unsigned char audio_memory [AUDIO_HEAP_SIZE];
unsigned char pointer_buf1 [PBANK_SIZE];
unsigned char pointer_buf2 [PBANK_SIZE];
unsigned char pointer_buf3 [PBANK_SIZE];
/* make sure of 32bit alignment */
unsigned int tune_buf1 [TUNE_SIZE/sizeof(int)];
unsigned int effect_buf1 [EFFECT_SIZE/sizeof(int)];
unsigned int effect_buf2 [EFFECT_SIZE/sizeof(int)];
unsigned int effect_buf3 [EFFECT_SIZE/sizeof(int)];
void InitMusicDriver(void)
{
musConfig init;
/* download sample .ptr, song .bin and effect .bfx files to RAM */
DmaRomToRam(PBANK1_START, pointer_buf1, PBANK1_END-PBANK1_START);
DmaRomToRam(PBANK2_START, pointer_buf2, PBANK2_END-PBANK2_START);
DmaRomToRam(PBANK3_START, pointer_buf3, PBANK3_END-PBANK3_START);
DmaRomToRam(MUSIC_START, tune_buf1, MUSIC_END-MUSIC_START);
DmaRomToRam(EFFECT1_START, effect_buf1, EFFECT1_END-EFFECT1_START);
DmaRomToRam(EFFECT2_START, effect_buf2, EFFECT2_END-EFFECT2_START);
DmaRomToRam(EFFECT3_START, effect_buf3, EFFECT3_END-EFFECT3_START);
/* setup configuration structure */
init.control_flag = 0;
init.channels = 28; /* lots of channels! */
init.sched = ≻
init.thread_priority = 12;
init.heap = audio_memory;
init.heap_length = AUDIO_HEAP_SIZE;
init.fifo_length = 64;
init.ptr = pointer_buf1;
init.wbk = WBANK1_START;
init.default_fxbank = effect_buf1;
init.syn_output_rate = 44100;
init.syn_updates = 256;
init.syn_rsp_cmds = 4096;
init.syn_retraceCount= 1;
init.syn_num_dma_bufs= 36;
init.syn_dma_buf_size= 0x800;
MusInitialize(&init);
/* initialise 2nd and 3rd sample banks */
MusPtrBankInitialize(pointer_buf2, WBANK2_START);
MusPtrBankInitialize(pointer_buf3, WBANK3_START);
/* initialise 2nd and 3rd effect banks */
MusFxBankInitialize(effect_buf2);
MusFxBankInitialize(effect_buf3);
/* set default sample bank for 2nd and 3rd effect banks */
MusFxBankSetPtrBank(effect_buf2, pointer_buf2);
MusFxBankSetPtrBank(effect_buf3, pointer_buf3);
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
[INTERNAL FUNCTION]
DmaRomToRam(rom, ram, len)
[Parameters]
rom address of ROM source
ram address of RAM destination
len number of bytes to transfer
[Explantion]
Download an area of ROM to RAM. Note this function limits the size of any DMA
generated to 16k so as to cause clashes with audio DMAs.
[Return value]
NONE
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/* avoid DMA clashes */
#define DMA_LEN 16384
static void DmaRomToRam(void *rom, void *ram, int len)
{
OSIoMesg io_mesg;
OSMesg dummyMesg;
int length;
u32 src;
unsigned char *dest;
src = (u32)rom;
dest = ram;
while (len)
{
if (len>DMA_LEN)
length = DMA_LEN;
else
length = len;
osInvalDCache(dest, length);
osPiStartDma(&io_mesg, OS_MESG_PRI_NORMAL, OS_READ, src, dest, length, &dma_queue);
osRecvMesg(&dma_queue, &dummyMesg, OS_MESG_BLOCK);
src+=length;
dest+=length;
len-=length;
}
}
/* end of file */