Compare commits
1 Commits
sound_tuni
...
sound_tuni
Author | SHA1 | Date | |
---|---|---|---|
68816a06fa |
@ -4,13 +4,15 @@ 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__
|
|
||||||
|
|
||||||
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include
|
CFLAGS=$(COMMONFLAGS) -std=gnu99 -O0 $(DEBUGFLAGS)
|
||||||
|
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) $^
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
#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() {
|
||||||
@ -31,7 +29,6 @@ int main() {
|
|||||||
|
|
||||||
__enable_interrupt();
|
__enable_interrupt();
|
||||||
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
schExec();
|
schExec();
|
||||||
}
|
}
|
||||||
|
@ -5,47 +5,21 @@
|
|||||||
#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_16, .legato = false, .staccato = false },
|
{ .octave = e_O_5, .note = e_C, .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_G, .length = e_L_1_4, .legato = false, .staccato = true },
|
||||||
{ .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 }, { .amplitude = 12, .tones = plingVoice2 }, { .amplitude = 12, .tones = plingVoice3 } },
|
.melodies = { { .amplitude = 12, .tones = plingVoice1 } },
|
||||||
.numOfMelodies = 3,
|
.chip = 1,
|
||||||
|
.numOfMelodies = 1,
|
||||||
.pace = 200,
|
.pace = 200,
|
||||||
.chip = 1
|
.slotMask = 0x02
|
||||||
};
|
};
|
||||||
|
|
||||||
void playPling() {
|
void playPling() {
|
||||||
|
@ -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 = INITIAL_PACE,
|
.pace = 160,
|
||||||
.chip = 0
|
.slotMask = 0x01
|
||||||
};
|
};
|
||||||
|
|
||||||
void playMelodyTetris() {
|
void playMelodyTetris() {
|
||||||
tetrisTheme.pace = INITIAL_PACE; // reset to start value each time
|
tetrisTheme.pace = 160; // reset to start value each time
|
||||||
sequencerPlayMelodies(&tetrisTheme);
|
sequencerPlayMelodies(&tetrisTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
void playMelodyTetrisFaster() {
|
void playMelodyTetrisFaster() {
|
||||||
tetrisTheme.pace += 15;
|
tetrisTheme.pace += 10;
|
||||||
sequencerChangePace(&tetrisTheme);
|
sequencerChangePace(&tetrisTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
.chip = 1
|
.slotMask = 0x02
|
||||||
};
|
};
|
||||||
|
|
||||||
void playTusch1() {
|
void playTusch1() {
|
||||||
sequencerPlayMelodies(&tusch1);
|
sequencerPlayMelodies(&tusch1);
|
||||||
// playMelodyTetrisFaster();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,6 +81,19 @@ 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];
|
||||||
}
|
}
|
||||||
@ -162,5 +175,21 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,16 @@ 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;
|
||||||
}
|
}
|
||||||
|
@ -106,8 +106,6 @@ 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;
|
||||||
}
|
}
|
||||||
@ -125,11 +123,8 @@ void sequencerPlayMelodies(t_melodies *melodies) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void sequencerStopMelodies(t_melodies *melodies) {
|
void sequencerStopMelodies(t_melodies *melodies) {
|
||||||
schDel(melodies->taskId);
|
|
||||||
slots &= ~(melodies->slotMask);
|
slots &= ~(melodies->slotMask);
|
||||||
for (uint8_t channel = 0; channel < melodies->numOfMelodies; channel++) {
|
schDel(melodies->taskId);
|
||||||
psgPlayTone(melodies->chip, channel, 0, e_O_Null, e_Pause);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sequencerChangePace(t_melodies *melodies) {
|
void sequencerChangePace(t_melodies *melodies) {
|
||||||
|
@ -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 slotMask;
|
|
||||||
uint8_t chip;
|
uint8_t chip;
|
||||||
|
uint8_t slotMask;
|
||||||
uint8_t taskId;
|
uint8_t taskId;
|
||||||
uint16_t quarterLength;
|
uint16_t quarterLength;
|
||||||
uint8_t numOfMelodies;
|
uint8_t numOfMelodies;
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#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:
|
||||||
@ -25,18 +29,19 @@ 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
|
||||||
@ -51,14 +56,12 @@ 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
|
||||||
|
Reference in New Issue
Block a user