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