sound volume configurable

This commit is contained in:
2024-05-21 12:31:55 +02:00
parent f9b63c06fe
commit faf75e158a
19 changed files with 129 additions and 27 deletions

View File

@ -12,7 +12,7 @@ ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include
$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o psg.o mute.o melody_pling.o
$(ARTIFACT).elf: main.o scheduler.o spi.o spi_init.o sequencer.o melody_tetris.o melody_tusch1.o psg.o mute.o melody_pling.o config.o
$(CC) -o $@ $(LDFLAGS) $^
$(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt

19
sound-driver/config.c Normal file
View File

@ -0,0 +1,19 @@
#include <stdint.h>
#include "config.h"
typedef struct {
uint8_t amplitude;
} config_t;
config_t config;
void configSetAmplitude(uint8_t v) {
config.amplitude = v;
}
uint8_t configGetAmplitude() {
return config.amplitude;
}

11
sound-driver/config.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef _CONFIG_H_
#define _CONFIG_H_
#include <stdint.h>
void configSetAmplitude(uint8_t v);
uint8_t configGetAmplitude();
#endif // _CONFIG_H_

View File

@ -1,8 +1,11 @@
#include <stdbool.h>
#include <sys/param.h>
#include <stddef.h>
#include "psg.h"
#include "sequencer.h"
#include "scheduler.h"
#include "config.h"
const t_tone plingVoice1[] = {
{ .octave = e_O_5, .note = e_C, .length = e_L_1_16, .legato = false, .staccato = false },
@ -18,13 +21,15 @@ const t_tone plingVoice1[] = {
};
t_melodies pling = {
.melodies = { { .amplitude = 12, .tones = plingVoice1 } },
.melodies = { { .tones = plingVoice1 } },
.amplitude = 12,
.numOfMelodies = 1,
.pace = 200,
.chip = 1
};
void playPling() {
pling.amplitude = MIN((configGetAmplitude() + 4), 15);
sequencerPlayMelodies(&pling);
}

View File

@ -1,8 +1,10 @@
#include <stdbool.h>
#include <sys/param.h>
#include <stddef.h>
#include "psg.h"
#include "sequencer.h"
#include "scheduler.h"
#include "config.h"
/*
@ -924,7 +926,8 @@ const t_tone voice3[] = {
#define INITIAL_PACE 160
t_melodies tetrisTheme = {
.melodies = { { .amplitude = 8, .tones = voice1 }, { .amplitude = 8, .tones = voice2 }, { .amplitude = 8, .tones = voice3 } },
.melodies = { { .tones = voice1 }, { .tones = voice2 }, { .tones = voice3 } },
.amplitude = 8,
.numOfMelodies = 3,
.pace = INITIAL_PACE,
.chip = 0
@ -932,6 +935,7 @@ t_melodies tetrisTheme = {
void playMelodyTetris() {
tetrisTheme.pace = INITIAL_PACE; // reset to start value each time
tetrisTheme.amplitude = MIN((configGetAmplitude() + 4), 15);
sequencerPlayMelodies(&tetrisTheme);
}

View File

@ -5,5 +5,6 @@
void playMelodyTetris();
void stopMelodyTetris();
void playMelodyTetrisFaster();
void playMelodyTetrisAmplitude(uint8_t a);
#endif // _MELODY_TETRIS_H_

View File

@ -1,9 +1,10 @@
#include <stdbool.h>
#include <sys/param.h>
#include <stddef.h>
#include "psg.h"
#include "sequencer.h"
#include "scheduler.h"
#include "melody_tetris.h"
#include "config.h"
const t_tone tusch1voice1[] = {
{ .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true },
@ -72,15 +73,16 @@ const t_tone tusch1voice3[] = {
};
t_melodies tusch1 = {
.melodies = { { .amplitude = 12, .tones = tusch1voice1 }, { .amplitude = 12, .tones = tusch1voice2 }, { .amplitude = 12, .tones = tusch1voice3 } },
.melodies = { { .tones = tusch1voice1 }, { .tones = tusch1voice2 }, { .tones = tusch1voice3 } },
.amplitude = 12,
.numOfMelodies = 3,
.pace = 200,
.chip = 1
};
void playTusch1() {
tusch1.amplitude = MIN((configGetAmplitude() + 4), 15);
sequencerPlayMelodies(&tusch1);
// playMelodyTetrisFaster();
}

View File

@ -59,7 +59,7 @@ void sequencerExec(void *handle) {
if (melody->tones[melody->idx].length == e_L_EndMark) {
melody->idx = 0;
}
psgPlayTone(melodies->chip, channel, melody->amplitude, melody->tones[melody->idx].octave, melody->tones[melody->idx].note);
psgPlayTone(melodies->chip, channel, melodies->amplitude, melody->tones[melody->idx].octave, melody->tones[melody->idx].note);
melody->lengthCnt = (melody->tones[melody->idx].staccato) ?
(calcLength(melodies, melody->tones[melody->idx].length) / 2) :
calcLength(melodies, melody->tones[melody->idx].length);

View File

@ -44,7 +44,6 @@ typedef struct {
uint16_t idx;
uint16_t lengthCnt;
t_sequencerState state;
uint8_t amplitude;
const t_tone *tones;
} t_melody;
@ -53,6 +52,7 @@ typedef struct {
typedef struct {
uint8_t slotMask;
uint8_t chip;
uint8_t amplitude;
uint8_t taskId;
uint16_t quarterLength;
uint8_t numOfMelodies;

View File

@ -8,7 +8,9 @@
#define SOUND_GAMEOVER 0x08
#define SOUND_FANFARE 0x10
#define SOUND_LOCK 0x20
#define SOUND_MOTION 0x40
#define SOUND_PLING 0x80
#define SOUND_PLING 0x40
#define SOUND_COMMAND 0x80
#define SOUND_SUBCMD_AMPLITUDE 0x40
#endif // _SOUND_CODES_H_

View File

@ -6,12 +6,21 @@
receive_isr:
bit #UCB0RXIFG, &UC0IFG
jz receive_isr_no_data
bit #SOUND_COMMAND, &cmd
jnz receive_isr_no_data
bis UCB0RXBUF, &cmd
receive_isr_no_data:
reti
.global spiCmdHandler
spiCmdHandler:
spiCmdHandler_0:
bit #SOUND_COMMAND, &cmd
jz spiCmdHandler_1
;; insert a call here
call #spiCommandDispatcher
mov.b #0, &cmd
ret
spiCmdHandler_1:
bit #SOUND_MUTE, &cmd
jz spiCmdHandler_2
@ -44,11 +53,6 @@ spiCmdHandler_6:
;; insert a call here
bic #SOUND_LOCK, &cmd
spiCmdHandler_7:
bit #SOUND_MOTION, &cmd
jz spiCmdHandler_8
;; insert a call here
bic #SOUND_MOTION, &cmd
spiCmdHandler_8:
bit #SOUND_PLING, &cmd
jz spiCmdHandler_end
call #playPling

View File

@ -4,9 +4,10 @@
#include "scheduler.h"
#include "spi.h"
#include "soundCodes.h"
#include "config.h"
uint8_t cmd;
volatile uint8_t cmd;
void spiInit() {
// SPI slave
@ -25,7 +26,14 @@ void spiInit() {
UC0IE |= UCB0RXIE;
cmd = SOUND_IDLE;
schAdd(spiCmdHandler, NULL, 0, 100);
schAdd(spiCmdHandler, NULL, 0, 5);
}
void spiCommandDispatcher() {
cmd &= ~SOUND_COMMAND;
if (cmd & SOUND_SUBCMD_AMPLITUDE) {
cmd &= ~SOUND_SUBCMD_AMPLITUDE;
configSetAmplitude(cmd);
}
}