|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
-
-
- #include <Arduino.h>
- #include "effect_granular.h"
-
- void AudioEffectGranular::begin(int16_t *sample_bank_def, int16_t max_len_def)
- {
- max_sample_len = max_len_def;
- grain_mode = 0;
- read_head = 0;
- write_head = 0;
- prev_input = 0;
- playpack_rate = 65536;
- accumulator = 0;
- allow_len_change = true;
- sample_loaded = false;
- sample_bank = sample_bank_def;
- }
-
- void AudioEffectGranular::beginFreeze_int(int grain_samples)
- {
- __disable_irq();
- grain_mode = 1;
- if (grain_samples < max_sample_len) {
- freeze_len = grain_samples;
- } else {
- freeze_len = grain_samples;
- }
- sample_loaded = false;
- write_en = false;
- sample_req = true;
- __enable_irq();
- }
-
- void AudioEffectGranular::beginPitchShift_int(int grain_samples)
- {
- __disable_irq();
- grain_mode = 2;
- if (allow_len_change) {
- if (grain_samples < 100) grain_samples = 100;
- int maximum = (max_sample_len - 1) / 3;
- if (grain_samples > maximum) grain_samples = maximum;
- glitch_len = grain_samples;
- }
- sample_loaded = false;
- write_en = false;
- sample_req = true;
- __enable_irq();
- }
-
- void AudioEffectGranular::stop()
- {
- grain_mode = 0;
- allow_len_change = true;
- }
-
- void AudioEffectGranular::update(void)
- {
- audio_block_t *block;
-
- if (sample_bank == NULL) {
- block = receiveReadOnly(0);
- if (block) release(block);
- return;
- }
-
- block = receiveWritable(0);
- if (!block) return;
-
- if (grain_mode == 0) {
-
- prev_input = block->data[AUDIO_BLOCK_SAMPLES-1];
- }
- else if (grain_mode == 1) {
-
- for (int j = 0; j < AUDIO_BLOCK_SAMPLES; j++) {
- if (sample_req) {
-
- int16_t current_input = block->data[j];
- if ((current_input < 0 && prev_input >= 0) ||
- (current_input >= 0 && prev_input < 0)) {
- write_en = true;
- write_head = 0;
- read_head = 0;
- sample_req = false;
- } else {
- prev_input = current_input;
- }
- }
- if (write_en) {
- sample_bank[write_head++] = block->data[j];
- if (write_head >= freeze_len) {
- sample_loaded = true;
- }
- if (write_head >= max_sample_len) {
- write_en = false;
- }
- }
- if (sample_loaded) {
- if (playpack_rate >= 0) {
- accumulator += playpack_rate;
- read_head = accumulator >> 16;
- }
- if (read_head >= freeze_len) {
- accumulator = 0;
- read_head = 0;
- }
- block->data[j] = sample_bank[read_head];
- }
- }
- }
- else if (grain_mode == 2) {
-
-
-
-
-
-
- for (int k = 0; k < AUDIO_BLOCK_SAMPLES; k++) {
-
- if (sample_req) {
- int16_t current_input = block->data[k];
- if ((current_input < 0 && prev_input >= 0) ||
- (current_input >= 0 && prev_input < 0)) {
- write_en = true;
- } else {
- prev_input = current_input;
- }
- }
-
- if (write_en) {
- sample_req = false;
- allow_len_change = true;
-
-
- if (write_head >= glitch_len) {
- write_head = 0;
- sample_loaded = true;
- write_en = false;
- allow_len_change = false;
- }
- sample_bank[write_head] = block->data[k];
- write_head++;
- }
-
- if (sample_loaded) {
-
-
- float fade_len = 20.00;
- int16_t m2 = fade_len;
-
- for (int m = 0; m < 2; m++) {
-
-
-
-
- sample_bank[m + glitch_len] = 0;
- }
-
- for (int m = 2; m < glitch_len-m2; m++) {
- sample_bank[m + glitch_len] = sample_bank[m];
- }
-
- for (int m = glitch_len-m2; m < glitch_len; m++) {
-
-
- float fadet = sample_bank[m] * (m2 / fade_len);
- sample_bank[m + glitch_len] = (int16_t)fadet;
- m2--;
- }
- sample_loaded = false;
- prev_input = block->data[k];
- sample_req = true;
- }
-
- accumulator += playpack_rate;
- read_head = (accumulator >> 16);
-
- if (read_head >= glitch_len) {
- read_head -= glitch_len;
- accumulator = 0;
-
- for (int m = 0; m < glitch_len; m++) {
- sample_bank[m + (glitch_len*2)] = sample_bank[m+glitch_len];
-
- }
- }
- block->data[k] = sample_bank[read_head + (glitch_len*2)];
- }
- }
- transmit(block);
- release(block);
- }
-
-
-
-
|