Browse Source

Merge pull request 'feature/load_pattern' (#2) from feature/load_pattern into develop

Reviewed-on: http://git.dslak.it:3000/dslak/Sonquencer/pulls/2
develop
dslak 5 years ago
parent
commit
cb53059cb3
  1. BIN
      C/banks/BANK1/1.wav
  2. 2
      C/compile.sh
  3. 18
      C/inputs.cpp
  4. 57
      C/loaders.cpp
  5. BIN
      C/main
  6. 73
      C/main.cpp
  7. 6
      C/patterns/pattern1
  8. 6
      C/patterns/pattern2
  9. 23
      C/players.cpp
  10. BIN
      C/sonquencer

BIN
C/banks/BANK1/1.wav

Binary file not shown.

2
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

18
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;
}
}

57
C/loaders.cpp

@ -1,7 +1,8 @@
int loadBank(int bank) { 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); int result = Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 512);
if( result < 0 ) { if( result < 0 ) {
@ -20,11 +21,61 @@ int loadBank(int bank) {
for( int i = 0; i < NUM_WAVEFORMS; i++ ) { for( int i = 0; i < NUM_WAVEFORMS; i++ ) {
sprintf(waveFileName, "banks/BANK%d/%d.wav", bank, i+1); 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); fprintf(stderr, "Unable to load wave file: %s\n", waveFileName);
} }
} }
return true; 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<cols; i++) {
pattern[lineCount-2][i] = line[i]-'0';
}
}
lineCount++;
}
printf("Pattern: %d\nBank: %d\nColumns: %d\nRows: %d\n", patternNum, bank, cols, rows);
matrix[0] = rows;
matrix[1] = cols;
for(int i=0; i<rows; i++) {
for(int y=0; y<cols; y++) {
printf("%d ", pattern[i][y]);
}
printf("\n");
}
fclose(fp);
if(line) {free(line);}
loadBank(bank);
}

BIN
C/main

Binary file not shown.

73
C/main.cpp

@ -1,25 +1,32 @@
#include <stdio.h> #include <stdio.h>
#include "SDL.h"
#include "SDL_mixer.h"
#include "SDL_image.h"
#include <unistd.h> #include <unistd.h>
#include <syslog.h> #include <syslog.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#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 "players.cpp"
#include "loaders.cpp" #include "loaders.cpp"
#include "inputs.cpp"
int main(int argc, char** argv) { int main(int argc, char** argv) {
bool done = false; bool done = false;
bool play = true; bool play = true;
int timer = 0; int timer = 0;
int step = 500;
int step = 0;
int stepDuration = 500;
SDL_Window* window; SDL_Window* window;
SDL_Renderer* renderer; SDL_Renderer* renderer;
@ -33,68 +40,48 @@ int main(int argc, char** argv) {
SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255); SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
SDL_Delay(1000); SDL_Delay(1000);
if(loadBank(1) == false) {return -1;}
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Event event; SDL_Event event;
if(loadBank(1) == false) {return -1;}
loadPattern(1);
while (!done) { while (!done) {
bool gotEvent = SDL_PollEvent(&event); bool gotEvent = SDL_PollEvent(&event);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
while (!done && gotEvent) { while (!done && gotEvent) {
switch (event.type) { switch (event.type) {
case SDL_KEYDOWN: 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; break;
case SDL_QUIT: case SDL_QUIT:
done = true; done = true;
break; break;
default: default:
break; break;
} }
if( !done ) { gotEvent = SDL_PollEvent(&event); } if( !done ) { gotEvent = SDL_PollEvent(&event); }
} }
playStep(play, &timer, &step);
if(play) {
playPattern(&timer, stepDuration, &step);
}
} }
for( int i = 0; i < NUM_WAVEFORMS; i++ ) { for( int i = 0; i < NUM_WAVEFORMS; i++ ) {
Mix_FreeChunk(_sample[i]);
Mix_FreeChunk(samples[i]);
} }
Mix_CloseAudio(); Mix_CloseAudio();

6
C/patterns/pattern1

@ -0,0 +1,6 @@
bank 1
rows 4
00000000
00000000
00000000
00000000

6
C/patterns/pattern2

@ -0,0 +1,6 @@
bank 2
rows 4
10000101
01000011
00100001
00010001

23
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); usleep(1000);
if(*timer == 0) { if(*timer == 0) {
printf("%d\n", *timer);
Mix_PlayChannel(-1, _sample[1], 0);
for(int i=0; i<matrix[0]; i++) {
if(pattern[i][*step-1] == 1) {
Mix_PlayChannel(-1, samples[i], 0);
}
}
*step = *step < matrix[1] ? *step+1 : 1;
} }
} }
void playSample(int sample) {
Mix_PlayChannel(-1, _sample[sample-1], 0);
void setSample(int sample, int step) {
pattern[sample-1][step-1] = 1;
for(int i=0; i<matrix[0]; i++) {
for(int y=0; y<matrix[1]; y++) {
printf("%d ", pattern[i][y]);
}
printf("\n");
}
} }

BIN
C/sonquencer

Binary file not shown.
Loading…
Cancel
Save