Browse Source

attempt to cache saws

cache_saws
Alexandros Theodotou 3 years ago
parent
commit
53fc9ddb66
Signed by: alex
GPG Key ID: 022EAE42313D70F3
  1. 150
      plugins/saw/saw.c

150
plugins/saw/saw.c

@ -28,6 +28,8 @@ @@ -28,6 +28,8 @@
#include "soundpipe.h"
#define MAX_SAMPLES 600000
typedef struct MidiKey
{
/** Pitch 0-127. */
@ -46,7 +48,17 @@ typedef struct MidiKey @@ -46,7 +48,17 @@ typedef struct MidiKey
int vel;
sp_adsr * adsr;
sp_blsaw * blsaws[7];
/** Pre-calculated saws. */
float waves[7][MAX_SAMPLES];
/** Sample counts. */
size_t wave_counts[7];
/** Index to start playing from. */
size_t wave_indices[7];
float last_played_samples[7];
/** Last signal known. */
float last_adsr;
@ -67,7 +79,10 @@ typedef struct SawValues @@ -67,7 +79,10 @@ typedef struct SawValues
float distortion_shape1;
float distortion_shape2;
float reverb_mix;
float keyfreqs[128][7];
/*float keyfreqs[128][7];*/
size_t key_sample_counts[128][7];
float key_samples[128][7][9000];
sp_blsaw * blsaws[128][7];
} SawValues;
/**
@ -142,6 +157,10 @@ calc_values ( @@ -142,6 +157,10 @@ calc_values (
{
for (int j = 0; j < 7; j++)
{
sp_blsaw_create (&values->blsaws[i][j]);
sp_blsaw_init (self->sp, values->blsaws[i][j]);
*values->blsaws[i][j]->amp = 1.0f;
/* voice spread */
int is_even = (j % 2) == 0;
float freq_apart;
@ -153,9 +172,47 @@ calc_values ( @@ -153,9 +172,47 @@ calc_values (
{
freq_apart = (float) (j / 2 + 1) * - freq_delta;
}
values->keyfreqs[i][j] =
float freq =
/*values->keyfreqs[i][j] =*/
self->keys[i].base_freq +
math_round_float_to_int (freq_apart);
*values->blsaws[i][j]->freq = freq;
/* calculate saw for 1 cycle */
float initial_samples_per_wave =
(float) self->common.samplerate / freq;
/* keep adding until we are close to a whole
* number */
float samples_per_wave =
initial_samples_per_wave;
int samples_per_wave_int =
math_round_float_to_int (samples_per_wave);
while (fabsf (
(float) samples_per_wave_int -
samples_per_wave) > 0.01f &&
(samples_per_wave +
initial_samples_per_wave) <
(float) MAX_SAMPLES)
{
samples_per_wave += initial_samples_per_wave;
samples_per_wave_int =
math_round_float_to_int (samples_per_wave);
}
values->key_sample_counts[i][j] =
(size_t) samples_per_wave_int;
/* calculate the values */
for (int k = 0; k < samples_per_wave_int; k++)
{
sp_blsaw_compute (
self->sp, values->blsaws[i][j], NULL,
&values->key_samples[i][j][k]);
/*printf ("computed [%d][%d][%d] %f\n",*/
/*i, j, k,*/
/*(double) values->key_samples[i][j][j]);*/
}
}
}
@ -204,8 +261,33 @@ set_values ( @@ -204,8 +261,33 @@ set_values (
for (int j = 0; j < 7; j++)
{
/* spread voices */
*key->blsaws[j]->freq = values->keyfreqs[i][j];
/* calculate an appropriate index */
int wave_index_set = 0;
for (size_t k = 0;
k < values->key_sample_counts[i][j]; k++)
{
if (fabsf (
values->key_samples[i][j][k] -
key->last_played_samples[j]) < 0.01f)
{
wave_index_set = 1;
key->wave_indices[j] = k + 1;
break;
}
}
if (!wave_index_set &&
key->wave_indices[j] >=
values->key_sample_counts[i][j])
key->wave_indices[j] = 0;
/* copy pre-calculated waves */
memcpy (
&key->waves[j][0], &values->key_samples[i][j][0],
sizeof (float) *
(size_t) values->key_sample_counts[i][j]);
key->wave_counts[j] =
values->key_sample_counts[i][j];
}
}
@ -329,49 +411,19 @@ instantiate ( @@ -329,49 +411,19 @@ instantiate (
lv2_log_logger_init (
&self->common.logger, self->common.map, self->common.log);
/* create synth */
/* create sp */
srand (time (NULL));
sp_create (&self->sp);
self->sp->len = MAX_SAMPLES;
/* create keys */
for (int i = 0; i < 128; i++)
{
MidiKey * key = &self->keys[i];
sp_create (&self->sp);
self->sp->len = 4800 * 6;
key->base_freq =
440.f * powf (2.f, ((float) i - 69.f) / 12.f);
/* create 7 saws */
for (int j = 0; j < 7; j++)
{
sp_create (&self->sp);
self->sp->len = 4800 * 60;
sp_blsaw_create (&key->blsaws[j]);
sp_blsaw_init (self->sp, key->blsaws[j]);
#define COMPUTE(times) \
for (int k = 0; k < (times); k++) { \
sp_blsaw_compute ( \
self->sp, key->blsaws[j], NULL, &self->sp->out[0]); \
}
/* randomize voices a bit */
int distance = 6000;
int is_even = (j % 2) == 0;
int computed = distance * 5;
if (is_even)
{
computed += (j / 2) * distance;
}
else
{
computed += (j / 2 + 1) * - distance;
}
COMPUTE (computed);
*key->blsaws[j]->amp = 1.0f;
}
/* create adsr */
sp_adsr_create (&key->adsr);
sp_adsr_init (self->sp, key->adsr);
@ -473,9 +525,11 @@ process ( @@ -473,9 +525,11 @@ process (
/* compute as many supersaws as needed */
for (int j = 0; j < 7; j++)
{
sp_blsaw_compute (
self->sp, key->blsaws[j], NULL,
&self->sp->out[0]);
self->sp->out[0] =
key->waves[j][key->wave_indices[j]];
key->wave_indices[j] =
(key->wave_indices[j] + 1) %
key->wave_counts[j];
float proximity_to_voice1 =
((float) (7 - j) / 7.f);
@ -622,11 +676,11 @@ deactivate ( @@ -622,11 +676,11 @@ deactivate (
for (int i = 0; i < 128; i++)
{
MidiKey * key = &self->keys[i];
for (int j = 0; j < 7; j++)
{
sp_blsaw_destroy (&key->blsaws[j]);
}
/*MidiKey * key = &self->keys[i];*/
/*for (int j = 0; j < 7; j++)*/
/*{*/
/*sp_blsaw_destroy (&key->blsaws[j]);*/
/*}*/
sp_destroy (&self->sp);
}
}

Loading…
Cancel
Save