example/aica/aica_xm: add volume table
This commit is contained in:
parent
dcf07fa398
commit
18a72b0869
@ -262,6 +262,14 @@ note_to_oct_fns(const int8_t note)
|
|||||||
return aica::oct_fns::OCT((int)whole) | aica::oct_fns::FNS((int)fns);
|
return aica::oct_fns::OCT((int)whole) | aica::oct_fns::FNS((int)fns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int8_t volume_table[] = {
|
||||||
|
0, 3, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11,
|
||||||
|
11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
|
||||||
|
13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
||||||
|
14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
||||||
|
15
|
||||||
|
};
|
||||||
|
|
||||||
void debug_note(interpreter_state& state, int ch, xm_pattern_format_t * pf)
|
void debug_note(interpreter_state& state, int ch, xm_pattern_format_t * pf)
|
||||||
{
|
{
|
||||||
static xm_pattern_format_t column[8];
|
static xm_pattern_format_t column[8];
|
||||||
@ -320,12 +328,9 @@ void play_note(interpreter_state& state, int ch, xm_pattern_format_t * pf)
|
|||||||
int len = s32(&sample_header->sample_loop_length) / 2;
|
int len = s32(&sample_header->sample_loop_length) / 2;
|
||||||
int loop_type = sample_header->type & 0b11;
|
int loop_type = sample_header->type & 0b11;
|
||||||
int lpctl = (loop_type == 2) ? 3 : loop_type;
|
int lpctl = (loop_type == 2) ? 3 : loop_type;
|
||||||
int disdl = (sample_header->volume * 0xf) / 64;
|
|
||||||
if (!(disdl <= 0xf))
|
|
||||||
printf("%d\n", sample_header->volume);
|
|
||||||
assert(disdl >= 0);
|
|
||||||
assert(disdl <= 0xf);
|
|
||||||
|
|
||||||
|
assert(sample_header->volume >= 0 && sample_header->volume <= 64);
|
||||||
|
int disdl = volume_table[sample_header->volume];
|
||||||
wait(); aica_sound.channel[ch].LPCTL(lpctl);
|
wait(); aica_sound.channel[ch].LPCTL(lpctl);
|
||||||
wait(); aica_sound.channel[ch].LSA(lsa);
|
wait(); aica_sound.channel[ch].LSA(lsa);
|
||||||
wait(); aica_sound.channel[ch].LEA(lsa + len);
|
wait(); aica_sound.channel[ch].LEA(lsa + len);
|
||||||
@ -386,10 +391,12 @@ void next_pattern(interpreter_state& state, int pattern_break)
|
|||||||
state.next_note_offset = 0;
|
state.next_note_offset = 0;
|
||||||
state.pattern_break = -1;
|
state.pattern_break = -1;
|
||||||
|
|
||||||
state.pattern_index += 1;
|
|
||||||
|
/*state.pattern_index += 1;
|
||||||
printf("pattern_index: %d\n", state.pattern_index);
|
printf("pattern_index: %d\n", state.pattern_index);
|
||||||
if (state.pattern_index >= 0xe)
|
if (state.pattern_index >= 0xe)
|
||||||
state.pattern_index = 1;
|
state.pattern_index = 1;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t __attribute__((aligned(32))) zero[0x28c0] = {};
|
uint8_t __attribute__((aligned(32))) zero[0x28c0] = {};
|
||||||
@ -529,6 +536,10 @@ void main()
|
|||||||
|
|
||||||
bool note_tick = state.tick % (state.ticks_per_line * 2) == 0;
|
bool note_tick = state.tick % (state.ticks_per_line * 2) == 0;
|
||||||
bool effect_tick = (state.tick & 1) == 0;
|
bool effect_tick = (state.tick & 1) == 0;
|
||||||
|
if (state.pattern_break >= 0 && note_tick) {
|
||||||
|
next_pattern(state, -1);
|
||||||
|
}
|
||||||
|
|
||||||
if (note_tick) {
|
if (note_tick) {
|
||||||
state.note_offset = state.next_note_offset;
|
state.note_offset = state.next_note_offset;
|
||||||
state.next_note_offset = parse_pattern_line(state, pattern_header, state.note_offset, play_debug_note);
|
state.next_note_offset = parse_pattern_line(state, pattern_header, state.note_offset, play_debug_note);
|
||||||
@ -538,12 +549,11 @@ void main()
|
|||||||
}
|
}
|
||||||
if (effect_tick && !note_tick) {
|
if (effect_tick && !note_tick) {
|
||||||
// execute effects
|
// execute effects
|
||||||
state.next_note_offset = parse_pattern_line(state, pattern_header, state.note_offset, play_note_effect);
|
parse_pattern_line(state, pattern_header, state.note_offset, play_note_effect);
|
||||||
wait(); aica_sound.channel[0].KYONEX(1);
|
wait(); aica_sound.channel[0].KYONEX(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.pattern_break >= 0 || state.next_note_offset >= pattern_data_size) {
|
if (state.next_note_offset >= pattern_data_size) {
|
||||||
printf("%d %d\n", state.pattern_break, state.next_note_offset);
|
|
||||||
next_pattern(state, -1);
|
next_pattern(state, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user