3 Commits

Author SHA1 Message Date
735599ee7f better pling 2024-04-25 19:14:46 +02:00
7a2c9f96d4 different pling, still boring 2024-04-25 12:21:50 +02:00
5d7a94c3b2 sound tuning 2024-04-25 12:12:52 +02:00
10 changed files with 61 additions and 71 deletions

View File

@ -4,15 +4,13 @@ OBJDUMP=$(TOOLCHAIN_PREFIX)/bin/msp430-elf-objdump
ARTIFACT=firmware ARTIFACT=firmware
MCU=msp430g2553 MCU=msp430g2553
COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -g0 -fdata-sections -ffunction-sections
DEBUGFLAGS= DEBUGFLAGS=
# DEBUGFLAGS+= -g3 -ggdb -gdwarf-2 # DEBUGFLAGS+= -g3 -ggdb -gdwarf-2
COMMONFLAGS=-Wall -mmcu=$(MCU) -I $(TOOLCHAIN_PREFIX)/include -O0 -g0 $(DEBUGFLAGS)
CFLAGS=$(COMMONFLAGS) -std=gnu99
ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__
CFLAGS=$(COMMONFLAGS) -std=gnu99 -O0 $(DEBUGFLAGS) LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include
ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__ -Os $(DEBUGFLAGS)
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include -Wl,-Map,firmware.map
$(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
$(CC) -o $@ $(LDFLAGS) $^ $(CC) -o $@ $(LDFLAGS) $^

View File

@ -6,6 +6,8 @@
#include "psg.h" #include "psg.h"
#include "scheduler.h" #include "scheduler.h"
#include "sequencer.h" #include "sequencer.h"
#include "melody_tetris.h"
#include "melody_tusch1.h"
#include "mute.h" #include "mute.h"
int main() { int main() {
@ -29,6 +31,7 @@ int main() {
__enable_interrupt(); __enable_interrupt();
while (1) { while (1) {
schExec(); schExec();
} }

View File

@ -5,21 +5,47 @@
#include "scheduler.h" #include "scheduler.h"
const t_tone plingVoice1[] = { const t_tone plingVoice1[] = {
{ .octave = e_O_5, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true }, { .octave = e_O_5, .note = e_C, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = true }, { .octave = e_O_5, .note = e_Cis, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_D, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_Dis, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_E, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_SyncMark,.legato = false, .staccato = false }, { .octave = e_O_Null, .note = e_Null, .length = e_L_SyncMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_StopMark,.legato = false, .staccato = false }, { .octave = e_O_Null, .note = e_Null, .length = e_L_StopMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false }, { .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
}; };
const t_tone plingVoice2[] = {
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_Gis, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_SyncMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_HoldMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
};
const t_tone plingVoice3[] = {
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false, .staccato = false },
{ .octave = e_O_5, .note = e_H, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_SyncMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_HoldMark,.legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
};
t_melodies pling = { t_melodies pling = {
.melodies = { { .amplitude = 12, .tones = plingVoice1 } }, .melodies = { { .amplitude = 12, .tones = plingVoice1 }, { .amplitude = 12, .tones = plingVoice2 }, { .amplitude = 12, .tones = plingVoice3 } },
.chip = 1, .numOfMelodies = 3,
.numOfMelodies = 1,
.pace = 200, .pace = 200,
.slotMask = 0x02 .chip = 1
}; };
void playPling() { void playPling() {

View File

@ -922,21 +922,21 @@ const t_tone voice3[] = {
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false }, { .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
}; };
#define INITIAL_PACE 160
t_melodies tetrisTheme = { t_melodies tetrisTheme = {
.melodies = { { .amplitude = 8, .tones = voice1 }, { .amplitude = 8, .tones = voice2 }, { .amplitude = 8, .tones = voice3 } }, .melodies = { { .amplitude = 8, .tones = voice1 }, { .amplitude = 8, .tones = voice2 }, { .amplitude = 8, .tones = voice3 } },
.chip = 0,
.numOfMelodies = 3, .numOfMelodies = 3,
.pace = 160, .pace = INITIAL_PACE,
.slotMask = 0x01 .chip = 0
}; };
void playMelodyTetris() { void playMelodyTetris() {
tetrisTheme.pace = 160; // reset to start value each time tetrisTheme.pace = INITIAL_PACE; // reset to start value each time
sequencerPlayMelodies(&tetrisTheme); sequencerPlayMelodies(&tetrisTheme);
} }
void playMelodyTetrisFaster() { void playMelodyTetrisFaster() {
tetrisTheme.pace += 10; tetrisTheme.pace += 15;
sequencerChangePace(&tetrisTheme); sequencerChangePace(&tetrisTheme);
} }

View File

@ -73,14 +73,14 @@ const t_tone tusch1voice3[] = {
t_melodies tusch1 = { t_melodies tusch1 = {
.melodies = { { .amplitude = 12, .tones = tusch1voice1 }, { .amplitude = 12, .tones = tusch1voice2 }, { .amplitude = 12, .tones = tusch1voice3 } }, .melodies = { { .amplitude = 12, .tones = tusch1voice1 }, { .amplitude = 12, .tones = tusch1voice2 }, { .amplitude = 12, .tones = tusch1voice3 } },
.chip = 1,
.numOfMelodies = 3, .numOfMelodies = 3,
.pace = 200, .pace = 200,
.slotMask = 0x02 .chip = 1
}; };
void playTusch1() { void playTusch1() {
sequencerPlayMelodies(&tusch1); sequencerPlayMelodies(&tusch1);
// playMelodyTetrisFaster();
} }

View File

@ -81,19 +81,6 @@ inline static void BUS_OP_CS1_DISABLE() {
BUS_CTRL_REG |= _CS1; BUS_CTRL_REG |= _CS1;
} }
#if 0
static void delay() {
asm volatile (
"push r12\n"
"mov.w #5, r12\n"
"loop:\n"
"dec.w r12\n"
"jnz loop\n"
"pop r12\n"
);
}
#endif
static uint8_t psgReadShadow(uint8_t chip, uint8_t address) { static uint8_t psgReadShadow(uint8_t chip, uint8_t address) {
return psgShadowRegisters[chip][address]; return psgShadowRegisters[chip][address];
} }
@ -175,21 +162,5 @@ void psgInit() {
// disable everything // disable everything
psgWrite(0, _ENABLE_REG, 0xff); psgWrite(0, _ENABLE_REG, 0xff);
psgWrite(1, _ENABLE_REG, 0xff); psgWrite(1, _ENABLE_REG, 0xff);
// volume to 0 on all channels
psgWrite(0, CHANNEL_A_AMPLITUDE_REG, 0);
psgWrite(0, CHANNEL_B_AMPLITUDE_REG, 0);
psgWrite(0, CHANNEL_C_AMPLITUDE_REG, 0);
psgWrite(1, CHANNEL_A_AMPLITUDE_REG, 0);
psgWrite(1, CHANNEL_B_AMPLITUDE_REG, 0);
psgWrite(1, CHANNEL_C_AMPLITUDE_REG, 0);
// frequency preset
psgWriteFrequency(0, 0, 0);
psgWriteFrequency(0, 1, 0);
psgWriteFrequency(0, 2, 0);
psgWriteFrequency(1, 0, 0);
psgWriteFrequency(1, 1, 0);
psgWriteFrequency(1, 2, 0);
} }

View File

@ -52,16 +52,6 @@ uint16_t schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t per
return taskId; return taskId;
} }
/*
void schDel(void (*exec)(void *), void *handle) {
for (uint16_t i = 0; i < MAX_NUM_OF_TASKS; i++) {
if ((tasks[i].exec == exec) && (tasks[i].handle == handle)) {
tasks[i].exec = NULL;
break;
}
}
}
*/
void schDel(uint16_t taskId) { void schDel(uint16_t taskId) {
tasks[taskId].exec = NULL; tasks[taskId].exec = NULL;
} }

View File

@ -106,6 +106,8 @@ void sequencerExec(void *handle) {
} }
void sequencerPlayMelodies(t_melodies *melodies) { void sequencerPlayMelodies(t_melodies *melodies) {
melodies->slotMask = (1 << melodies->chip);
if ((slots & melodies->slotMask) != 0) { if ((slots & melodies->slotMask) != 0) {
return; return;
} }
@ -123,8 +125,11 @@ void sequencerPlayMelodies(t_melodies *melodies) {
} }
void sequencerStopMelodies(t_melodies *melodies) { void sequencerStopMelodies(t_melodies *melodies) {
slots &= ~(melodies->slotMask);
schDel(melodies->taskId); schDel(melodies->taskId);
slots &= ~(melodies->slotMask);
for (uint8_t channel = 0; channel < melodies->numOfMelodies; channel++) {
psgPlayTone(melodies->chip, channel, 0, e_O_Null, e_Pause);
}
} }
void sequencerChangePace(t_melodies *melodies) { void sequencerChangePace(t_melodies *melodies) {

View File

@ -51,8 +51,8 @@ typedef struct {
#define SEQUENCER_PERIOD 4 // ms #define SEQUENCER_PERIOD 4 // ms
#define NUM_OF_CHANNELS 3 #define NUM_OF_CHANNELS 3
typedef struct { typedef struct {
uint8_t chip;
uint8_t slotMask; uint8_t slotMask;
uint8_t chip;
uint8_t taskId; uint8_t taskId;
uint16_t quarterLength; uint16_t quarterLength;
uint8_t numOfMelodies; uint8_t numOfMelodies;

View File

@ -1,10 +1,6 @@
#include <msp430g2553.h> #include <msp430g2553.h>
#include "soundCodes.h" #include "soundCodes.h"
;; .global cmd
;; .section .data.spi,"aw"
;;cmd:
;; .byte
.section ".text","ax",@progbits .section ".text","ax",@progbits
receive_isr: receive_isr:
@ -29,19 +25,18 @@ spiCmdHandler_2:
spiCmdHandler_3: spiCmdHandler_3:
bit #SOUND_START, &cmd bit #SOUND_START, &cmd
jz spiCmdHandler_4 jz spiCmdHandler_4
;;call #playMelodyTetris call #playMelodyTetris
bic #SOUND_START, &cmd bic #SOUND_START, &cmd
spiCmdHandler_4: spiCmdHandler_4:
bit #SOUND_GAMEOVER, &cmd bit #SOUND_GAMEOVER, &cmd
jz spiCmdHandler_5 jz spiCmdHandler_5
;;call #stopMelodyTetris call #stopMelodyTetris
;; insert a call here
bic #SOUND_GAMEOVER, &cmd bic #SOUND_GAMEOVER, &cmd
spiCmdHandler_5: spiCmdHandler_5:
bit #SOUND_FANFARE, &cmd bit #SOUND_FANFARE, &cmd
jz spiCmdHandler_6 jz spiCmdHandler_6
;;call #playMelodyTetrisFaster call #playMelodyTetrisFaster
;;call #playTusch1 call #playTusch1
bic #SOUND_FANFARE, &cmd bic #SOUND_FANFARE, &cmd
spiCmdHandler_6: spiCmdHandler_6:
bit #SOUND_LOCK, &cmd bit #SOUND_LOCK, &cmd
@ -56,12 +51,14 @@ spiCmdHandler_7:
spiCmdHandler_8: spiCmdHandler_8:
bit #SOUND_PLING, &cmd bit #SOUND_PLING, &cmd
jz spiCmdHandler_end jz spiCmdHandler_end
;;call #playPling call #playPling
bic #SOUND_PLING, &cmd bic #SOUND_PLING, &cmd
spiCmdHandler_end: spiCmdHandler_end:
ret ret
.section "__interrupt_vector_8","ax",@progbits .section "__interrupt_vector_8","ax",@progbits
.word receive_isr .word receive_isr
.end .end