20 void replace_byte(
int *address,
int intOffset,
int byteOffset,
int newVal);
21 void sound_config(
sound_t *device);
50 device = (
void *) malloc(
sizeof(
sound_t));
53 if(pin == -1 || pin2 == -1)
55 device->ctraval = (0b00110 << 26);
58 device->ctraval |= pin;
59 device->pinmask = 1 << pin;
63 device->ctraval |= pin2;
64 device->pinmask = 1 << pin2;
69 device->ctraval = (0b00111 << 26) | pin | (pin2 << 9);
70 device->pinmask = (1 << pin) | (1 << pin2);
77 extern int binary_audiosynth_dat_start[];
78 device->cog = 1 +
cognew((
void*)binary_audiosynth_dat_start, (
void*)device);
83 void sound_config(
sound_t *device)
85 device->osc_sample = 0;
87 device->osc_envelope = 0x00000000;
88 device->osc_attack = 0x7f7f7f7f;
89 device->osc_decay = 0;
90 device->osc_sustain = 0;
91 device->osc_release = 0;
92 device->osc_waveform = 0x03030303;
93 device->osc_state = 0;
95 device->osc_target[0] = 0;
96 device->osc_target[1] = 0;
97 device->osc_target[2] = 0;
98 device->osc_target[3] = 0;
100 device->osc_vol[0] = (127<<12);
101 device->osc_vol[1] = (127<<12);
102 device->osc_vol[2] = (127<<12);
103 device->osc_vol[3] = (127<<12);
105 device->osc_inc[0] = 0;
106 device->osc_inc[1] = 0;
107 device->osc_inc[2] = 0;
108 device->osc_inc[3] = 0;
110 device->osc_acc[0] = 0;
111 device->osc_acc[1] = 0;
112 device->osc_acc[2] = 0;
113 device->osc_acc[3] = 0;
115 device->freqtable[0] = 439638;
116 device->freqtable[1] = 465780;
117 device->freqtable[2] = 493477;
118 device->freqtable[3] = 522820;
119 device->freqtable[4] = 553909;
120 device->freqtable[5] = 586846;
121 device->freqtable[6] = 621742;
122 device->freqtable[7] = 658713;
123 device->freqtable[8] = 697882;
124 device->freqtable[9] = 739380;
125 device->freqtable[10] = 783346;
126 device->freqtable[11] = 829926;
141 device->osc_vol[channel] = value << 12;
146 device->osc_inc[channel] = device->freqtable[value%12] >> (9-value/12);
152 device->osc_inc[channel] = (int) ((
float)Hz * 52.4288);
155 void sound_playChords(
sound_t *device,
float *chords)
157 float beatVal, tempo, tFullNote, msBeat;
158 float *hold0 = 0, *ch0 = 0,
159 *hold1 = 0, *ch1 = 0,
160 *hold2 = 0, *ch2 = 0,
161 *hold3 = 0, *ch3 = 0,
168 if(chords[i] == BEAT_VAL)
174 else if(chords[i] == TEMPO)
178 msBeat = 60000.0 / tempo;
179 tFullNote = msBeat / beatVal;
182 else if(chords[i] == HOLD0)
188 else if(chords[i] == HOLD1)
194 else if(chords[i] == HOLD2)
200 else if(chords[i] == HOLD3)
206 else if(chords[i] == CH0)
212 else if(chords[i] == CH1)
218 else if(chords[i] == CH2)
224 else if(chords[i] == CH3)
230 else if(chords[i] == END)
287 void sound_freqRaw(
sound_t *device,
int channel,
int value)
289 device->osc_inc[channel] = value;
308 void replace_byte(
int *address,
int intOffset,
int byteOffset,
int newVal)
310 int temp = address[intOffset];
311 int nmask = ~(0xFF << (8*byteOffset));
314 temp |= (newVal << (8*byteOffset));
315 address[intOffset] = temp;
318 void sound_param(
sound_t *device,
int type,
int channel,
int value)
320 replace_byte(&(device->osc_envelope),
type, channel, value);
332 void sound_adsr(
sound_t *device,
int channel,
int attack,
int decay,
333 int sustain,
int release)
335 replace_byte(&(device->osc_attack), 0, channel, attack);
336 replace_byte(&(device->osc_decay), 0, channel, decay);
337 replace_byte(&(device->osc_sustain), 0, channel, sustain);
338 replace_byte(&(device->osc_release), 0, channel, release);
354 void sound_loadPatch(
sound_t *device,
int *patchAddr)
366 replace_byte(&(device->osc_waveform), 0, channel, value);
378 void sound_envelopeSet(
sound_t *device,
int channel,
int value)
380 int temp = device->osc_envelope;
381 int mask = ~(1<<(8*channel));
383 if(value) temp |= (1<<(8*channel));
384 device->osc_envelope = temp;
396 void sound_envelopeStart(
sound_t *device,
int channel,
int enable)
398 int temp = device->osc_envelope;
399 int mask = ~(2<<(8*channel));
401 if(enable) temp |= (2<<(8*channel));
402 temp |= (4<<(8*channel));
403 temp &= ~(4<<(8*channel));
404 device->osc_envelope = temp;
413 void sound_sampleSet(
sound_t *device,
int value)
415 device->osc_sample = value;
426 void sound_playSound(
sound_t *device,
int channel,
int value)
428 sound_envelopeSet(device, channel, 1);
429 sound_envelopeStart(device, channel, 1);
440 void sound_endSound(
sound_t *device,
int channel)
442 sound_envelopeStart(device, channel, 1);
452 void sound_endAllSound(
sound_t *device)
454 for(
int channel = 0; channel < 4; channel++)
455 sound_endSound(device, channel);