Browse Source

Merge fd01a9336e into 7fa089095c

pull/6/merge
Thorsten Kiefer GitHub 6 years ago
parent
commit
0daf79cf8b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 168 additions and 0 deletions
  1. +168
    -0
      tokisbeats.cpp

+ 168
- 0
tokisbeats.cpp View File

@@ -0,0 +1,168 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

/*
* File: main.cpp
* Author: thorsten
*
* Created on 12. August 2018, 00:23
*/

#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

extern "C" {
#include <jack/jack.h>
#include <unistd.h>
}

using namespace std;

float accel = 8.0;

struct Instrument {
float freqA;
float freqB;
float shiftA;
float shiftB;
float power;
bool signum;
jack_default_audio_sample_t buffer[44100];

float compute(float x) {
float y = sin(x * freqA + shiftA);
if (signum) y = -signbit(y) * 2.0 + 1.0;
y *= (cos(x * freqB + shiftB) + 1.0) / 2.0;
y /= 1 + pow(x, power);
return y;
}

void randomize() {
freqA = (float) rand() / RAND_MAX * 0.19 + 0.01;
freqB = (float) rand() / RAND_MAX * 0.01 + 0.005;
shiftA = (float) rand() / RAND_MAX * 0.2;
shiftB = (float) rand() / RAND_MAX * 0.2;
power = (float) rand() / RAND_MAX * 0.2 + 0.2;
signum = rand() & 1;

for (int i = 0; i < sizeof (buffer) / sizeof (buffer[0]); ++i) buffer[i] = 0;

for (int i = 0; i < (float) sizeof (buffer) / (float) sizeof (buffer[0]) / accel; ++i) {
buffer[i] = compute((float) i / accel);
}

float sum = 0;
for (int i = 0; i < sizeof (buffer) / sizeof (buffer[0]); ++i) sum += buffer[i];
for (int i = 0; i < sizeof (buffer) / sizeof (buffer[0]); ++i) buffer[i] /= sum;
for (int i = 0; i < sizeof (buffer) / sizeof (buffer[0]); ++i) buffer[i] *= 200;
}
};

struct Pattern {
Instrument aud;
bool pat[16];

int bounds(int i) {
while (i < 0) i += 16;
while (i >= 16) i -= 16;

return i;
}

void randomize() {
for (int i = 0; i < 16; ++i) pat[i] = false;

for (int i = 0; i < 4; ++i) {
if (rand() & 1) {
pat[4 * i] = true;

if (rand() & 1) {
pat[bounds(4 * i + 2)] = true;
}
if (rand() & 1) {
pat[bounds(4 * i - 1)] = true;
}
}
}
}
};

int index = 0;
int counter = 0;
int x;
jack_client_t *jc;
jack_port_t *jp;
Pattern patterns[10];

void randomize() {
for (int i = 0; i < sizeof (patterns) / sizeof (patterns[0]); ++i) {
patterns[i].aud.randomize();
patterns[i].randomize();
}
}

int myCallback(jack_nframes_t nframes, void *arg) {
if (jack_port_connected(jp)) {
jack_default_audio_sample_t *b = (jack_default_audio_sample_t *) jack_port_get_buffer(jp, nframes);

for (int j = 0; j < nframes; ++j) {
b[j] = 0;
for (int i = 0; i < sizeof (patterns) / sizeof (patterns[0]); ++i) {
if (patterns[i].pat[index]) {
b[j] += patterns[i].aud.buffer[x + j];
}
}
}

x += nframes;

if (x > (44100 / accel)) {
x = 0;
index += 1;

if (index >= 16) {
index = 0;
counter += 1;

if (counter >= 4) {
counter = 0;
randomize();
}
}
}
}

return 0;
}

/*
*
*/
int main(int argc, char** argv) {
time_t t;
time(&t);
srand(t);

randomize();

jack_status_t stat;
jc = jack_client_open("TokisBeat", JackNullOption, &stat);
jack_set_process_callback(jc, myCallback, 0);

cout << stat << endl;

jp = jack_port_register(jc, "Mono Port", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
jack_activate(jc);

while (true) {
usleep(1000);
}

return 0;
}


Loading…
Cancel
Save