diff --git a/C/banks/BANK1/1.wav b/C/banks/BANK1/1.wav index dcb8553..3de85f6 100644 Binary files a/C/banks/BANK1/1.wav and b/C/banks/BANK1/1.wav differ diff --git a/C/compile.sh b/C/compile.sh index 561922d..65c4f0e 100644 --- a/C/compile.sh +++ b/C/compile.sh @@ -1 +1 @@ -g++ -o sonquencer -I/usr/include/SDL2 main.cpp -lSDL2 -lSDL2_image -lSDL2_ttf -lSDL2_mixer +g++ -o sonquencer -I/usr/include/SDL2 main.cpp -lSDL2 -lSDL2_image -lSDL2_ttf -lSDL2_mixer diff --git a/C/inputs.cpp b/C/inputs.cpp new file mode 100644 index 0000000..bf732e5 --- /dev/null +++ b/C/inputs.cpp @@ -0,0 +1,18 @@ +void inputActions(SDL_Event e, int step) { + switch (e.key.keysym.sym) { + case SDLK_1: + setSample(1, step); + break; + case SDLK_2: + setSample(2, step); + break; + case SDLK_3: + setSample(3, step); + break; + case SDLK_4: + setSample(4, step); + break; + default: + break; + } +} diff --git a/C/loaders.cpp b/C/loaders.cpp index 7350a19..10a0b39 100644 --- a/C/loaders.cpp +++ b/C/loaders.cpp @@ -1,7 +1,8 @@ int loadBank(int bank) { - memset(_sample, 0, sizeof(Mix_Chunk*) * NUM_WAVEFORMS); + printf("\nLoading bank %d ...\n", bank); + memset(samples, 0, sizeof(Mix_Chunk*) * NUM_WAVEFORMS); int result = Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 512); if( result < 0 ) { @@ -20,11 +21,61 @@ int loadBank(int bank) { for( int i = 0; i < NUM_WAVEFORMS; i++ ) { sprintf(waveFileName, "banks/BANK%d/%d.wav", bank, i+1); - _sample[i] = Mix_LoadWAV(waveFileName); - if( _sample[i] == NULL ) { + samples[i] = Mix_LoadWAV(waveFileName); + if( samples[i] == NULL ) { fprintf(stderr, "Unable to load wave file: %s\n", waveFileName); } } return true; } + + +void loadPattern(int patternNum) { + printf("\nLoading pattern %d ...\n", patternNum); + + FILE *fp; + char *line = NULL; + size_t len = 0; + ssize_t read; + int lineCount = 0; + char patternFile[16]; + + int bank = 0; + int cols = 0; + int rows = 0; + + sprintf(patternFile, "patterns/pattern%d", patternNum); + fp = fopen(patternFile, "r"); + if(fp == NULL) {exit(EXIT_FAILURE);} + + while ((read = getline(&line, &len, fp)) != -1) { + if(lineCount == 0) { bank = line[10]-'0'; } + if(lineCount == 1) { rows = line[10]-'0'; } + if(lineCount > 1) { + if(lineCount == 2) { + cols = read-1; + } + for(int i=0; i -#include "SDL.h" -#include "SDL_mixer.h" -#include "SDL_image.h" #include #include #include #include -#define NUM_WAVEFORMS 6 +#include "SDL.h" +#include "SDL_mixer.h" +#include "SDL_image.h" + +#define NUM_WAVEFORMS 4 +#define PATTERN_ROWS 10 +#define PATTERN_COLS 32 -Mix_Chunk* _sample[NUM_WAVEFORMS]; +Mix_Chunk* samples[NUM_WAVEFORMS]; +int pattern[PATTERN_ROWS][PATTERN_COLS]; +int matrix[] = {PATTERN_ROWS, PATTERN_COLS}; #include "players.cpp" #include "loaders.cpp" +#include "inputs.cpp" int main(int argc, char** argv) { bool done = false; bool play = true; int timer = 0; - int step = 500; + int step = 0; + int stepDuration = 500; SDL_Window* window; SDL_Renderer* renderer; @@ -33,68 +40,48 @@ int main(int argc, char** argv) { SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255); SDL_Delay(1000); - if(loadBank(1) == false) {return -1;} - + SDL_RenderClear(renderer); + SDL_RenderPresent(renderer); SDL_Event event; + if(loadBank(1) == false) {return -1;} + loadPattern(1); + while (!done) { bool gotEvent = SDL_PollEvent(&event); - SDL_RenderClear(renderer); - SDL_RenderPresent(renderer); - while (!done && gotEvent) { switch (event.type) { case SDL_KEYDOWN: - - switch (event.key.keysym.sym) { - case SDLK_ESCAPE: - Mix_CloseAudio(); - SDL_Quit(); - return 0; - break; - case SDLK_1: - playSample(1); - break; - case SDLK_2: - playSample(2); - break; - case SDLK_3: - playSample(3); - break; - case SDLK_4: - playSample(4); - break; - case SDLK_5: - playSample(5); - break; - case SDLK_6: - playSample(6); - break; - - default: - break; + if(event.key.keysym.sym == SDLK_ESCAPE) { + Mix_CloseAudio(); + SDL_Quit(); + return 0; + } else { + inputActions(event, step); } break; - case SDL_QUIT: done = true; break; - default: break; + + } if( !done ) { gotEvent = SDL_PollEvent(&event); } } - playStep(play, &timer, &step); + if(play) { + playPattern(&timer, stepDuration, &step); + } } for( int i = 0; i < NUM_WAVEFORMS; i++ ) { - Mix_FreeChunk(_sample[i]); + Mix_FreeChunk(samples[i]); } Mix_CloseAudio(); diff --git a/C/patterns/pattern1 b/C/patterns/pattern1 new file mode 100644 index 0000000..9ea7a1d --- /dev/null +++ b/C/patterns/pattern1 @@ -0,0 +1,6 @@ +bank 1 +rows 4 +00000000 +00000000 +00000000 +00000000 diff --git a/C/patterns/pattern2 b/C/patterns/pattern2 new file mode 100644 index 0000000..38b80f1 --- /dev/null +++ b/C/patterns/pattern2 @@ -0,0 +1,6 @@ +bank 2 +rows 4 +10000101 +01000011 +00100001 +00010001 diff --git a/C/players.cpp b/C/players.cpp index 633a6f1..544b71f 100644 --- a/C/players.cpp +++ b/C/players.cpp @@ -1,15 +1,24 @@ -void playStep(bool play, int *timer, int *step) { - *timer = *timer >= *step ? 0 : *timer+1; +void playPattern(int *timer, int duration, int *step) { + *timer = *timer >= duration ? 0 : *timer+1; usleep(1000); if(*timer == 0) { - printf("%d\n", *timer); - - Mix_PlayChannel(-1, _sample[1], 0); + for(int i=0; i