forked from buddhabrot/fusion-zauberstab
drawing
This commit is contained in:
parent
bb0fb29369
commit
28ef0b2c0d
@ -1,222 +0,0 @@
|
|||||||
#include <FastLED.h>
|
|
||||||
|
|
||||||
|
|
||||||
//lichterkette: PWM 2
|
|
||||||
//mikrofon: A1
|
|
||||||
#define LED_PIN 2
|
|
||||||
#define NUM_LEDS 144
|
|
||||||
|
|
||||||
|
|
||||||
#define SAMPLING_FREQUENCY_BP 40 // number of energy chunks per second
|
|
||||||
#define SAMPLING_FREQUENCY_CONTROL 1 // check number of times per second if the current band pass is the best one
|
|
||||||
#define Q 20. // quality factor of band pass filters
|
|
||||||
#define PI 3.1415926535897932384626433832795
|
|
||||||
#define n_BP 30 //number of band pass filters
|
|
||||||
|
|
||||||
|
|
||||||
CRGB leds[NUM_LEDS];
|
|
||||||
|
|
||||||
unsigned long sampling_period_bp = 1000000L/SAMPLING_FREQUENCY_BP;
|
|
||||||
unsigned long sampling_period_control = 1000000L/SAMPLING_FREQUENCY_CONTROL;
|
|
||||||
double energy = 0;
|
|
||||||
unsigned long last_us_bp = 0L;
|
|
||||||
unsigned long last_us_control = 0L;
|
|
||||||
|
|
||||||
float a0[n_BP];
|
|
||||||
float a1[n_BP];
|
|
||||||
float a2[n_BP];
|
|
||||||
float b0[n_BP];
|
|
||||||
//float b1[n_BP];
|
|
||||||
float b2[n_BP];
|
|
||||||
|
|
||||||
float a[n_BP];
|
|
||||||
float w0[n_BP];
|
|
||||||
|
|
||||||
float yy1[n_BP];
|
|
||||||
float yy2[n_BP];
|
|
||||||
float yy3[n_BP];
|
|
||||||
float yy4[n_BP];
|
|
||||||
float yy5[n_BP];
|
|
||||||
float yy6[n_BP];
|
|
||||||
|
|
||||||
float u1[n_BP];
|
|
||||||
float u2[n_BP];
|
|
||||||
float y[n_BP];
|
|
||||||
float y_fil[n_BP];
|
|
||||||
|
|
||||||
float angle;
|
|
||||||
float angle2;
|
|
||||||
|
|
||||||
double energy_fil = 800.;
|
|
||||||
|
|
||||||
|
|
||||||
float pos_target = NUM_LEDS/2;
|
|
||||||
float pos_target_filtered = NUM_LEDS/2;
|
|
||||||
|
|
||||||
float microphone_offset = 512;
|
|
||||||
long initial_time;
|
|
||||||
|
|
||||||
int active = 15;
|
|
||||||
int candidate = 15;
|
|
||||||
int rounds = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
|
|
||||||
Serial.begin(250000);
|
|
||||||
|
|
||||||
FastLED.addLeds<WS2812, LED_PIN, RGB>(leds, NUM_LEDS);
|
|
||||||
FastLED.setMaxPowerInVoltsAndMilliamps(5, 300);
|
|
||||||
|
|
||||||
// for(int i = 0; i < NUM_LEDS; i++)
|
|
||||||
// { int brightness = get_value(i, pos_target_filtered);
|
|
||||||
// leds[i].setRGB(brightness, brightness, brightness); }
|
|
||||||
// FastLED.show();
|
|
||||||
//
|
|
||||||
// long sumsamples = 0;
|
|
||||||
// for(int j = 1; j<1000; j++)
|
|
||||||
// {
|
|
||||||
// int sample = analogRead(1);
|
|
||||||
// sumsamples += sample;
|
|
||||||
// delay(1);
|
|
||||||
// if(j==500)
|
|
||||||
// {
|
|
||||||
// sumsamples = 0;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// microphone_offset = sumsamples/500;
|
|
||||||
|
|
||||||
|
|
||||||
set_filter();
|
|
||||||
initial_time = micros();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_filter() {
|
|
||||||
for(int i = 0; i < n_BP; i++)
|
|
||||||
{
|
|
||||||
float frequency = 1.75+i*(2.4-1.75)/n_BP;
|
|
||||||
w0[i] = 2.*PI*frequency/SAMPLING_FREQUENCY_BP;
|
|
||||||
a[i] = sin(w0[i]/(2.*Q));
|
|
||||||
b0[i] = a[i];
|
|
||||||
//b1[i] = 0;
|
|
||||||
b2[i] = -a[i];
|
|
||||||
a0[i] = 1.+a[i];
|
|
||||||
a1[i] = -2.*cos(w0[i]);
|
|
||||||
a2[i] = 1.-a[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_value(int pos, float pos0) {
|
|
||||||
if (abs(pos0-pos) > 20) { return 0; }
|
|
||||||
else { return (40-abs(pos0-pos)*2); }
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
|
|
||||||
int sample = int(analogRead(1) - microphone_offset);
|
|
||||||
energy += abs(sample)*abs(sample);
|
|
||||||
|
|
||||||
if (micros() - last_us_bp > sampling_period_bp)
|
|
||||||
{
|
|
||||||
|
|
||||||
Serial.println(sample);
|
|
||||||
|
|
||||||
microphone_offset += (analogRead(1)-microphone_offset)*0.001;
|
|
||||||
|
|
||||||
//Serial.println(microphone_offset);
|
|
||||||
|
|
||||||
last_us_bp += sampling_period_bp;
|
|
||||||
energy_fil += (energy - energy_fil) * 0.01;
|
|
||||||
//Serial.println(energy);
|
|
||||||
for(int i = 0; i < n_BP; i++)
|
|
||||||
{
|
|
||||||
y[i] = (b0[i]/a0[i])*energy + 0. + (b2[i]/a0[i])*u2[i] - (a1[i]/a0[i])*yy1[i] - (a2[i]/a0[i])*yy2[i];
|
|
||||||
u2[i] = u1[i];
|
|
||||||
u1[i] = energy;
|
|
||||||
yy6[i] = yy5[i];
|
|
||||||
yy5[i] = yy4[i];
|
|
||||||
yy4[i] = yy3[i];
|
|
||||||
yy3[i] = yy2[i];
|
|
||||||
yy2[i] = yy1[i];
|
|
||||||
yy1[i] = y[i];
|
|
||||||
y_fil[i] += (abs(y[i]) - y_fil[i]) * 0.005; //linie der scheitelpunkte
|
|
||||||
}
|
|
||||||
|
|
||||||
float delays = constrain( SAMPLING_FREQUENCY_BP * 0.25/(1.75+active*(2.4-1.75)/n_BP) , 4., 6.);
|
|
||||||
|
|
||||||
float delayed = 0;
|
|
||||||
if (delays > 5)
|
|
||||||
{delayed = yy5[active]*(1-delays+5) + yy6[active]*(delays-5); }
|
|
||||||
else
|
|
||||||
{delayed = yy4[active]*(1-delays+4) + yy5[active]*(delays-4); }
|
|
||||||
|
|
||||||
angle = atan2(delayed , y[active]);
|
|
||||||
|
|
||||||
if (PI < abs(angle - angle2) && abs(angle - angle2) < 3*PI)
|
|
||||||
{ angle2 = angle + 2*PI; }
|
|
||||||
else
|
|
||||||
{ angle2 = angle; }
|
|
||||||
|
|
||||||
pos_target = map(angle2, -PI, 3*PI, -0.3*NUM_LEDS, NUM_LEDS*1.5);
|
|
||||||
|
|
||||||
if (pos_target > pos_target_filtered)
|
|
||||||
{ pos_target_filtered += (pos_target - pos_target_filtered)*0.35; }
|
|
||||||
else
|
|
||||||
{ pos_target_filtered = pos_target; }
|
|
||||||
|
|
||||||
// Serial.print(y_fil[active]);
|
|
||||||
// Serial.print(",");
|
|
||||||
// Serial.println(y[active]);
|
|
||||||
|
|
||||||
energy = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for(int i = 0; i < NUM_LEDS; i++)
|
|
||||||
{
|
|
||||||
int brightness = get_value(i, pos_target_filtered);
|
|
||||||
|
|
||||||
//leds[i].setRGB(brightness, brightness, brightness);
|
|
||||||
leds[i].setHSV( 160, (rounds == 6) ? 60 : 0, brightness);
|
|
||||||
}
|
|
||||||
FastLED.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (micros() - last_us_control > sampling_period_control)
|
|
||||||
{
|
|
||||||
last_us_control += sampling_period_control;
|
|
||||||
int argmax = -1;
|
|
||||||
float valuemax = 0;
|
|
||||||
for(int i = 0; i < n_BP; i++)
|
|
||||||
{
|
|
||||||
if(y_fil[i] > valuemax)
|
|
||||||
{
|
|
||||||
valuemax = y_fil[i];
|
|
||||||
argmax = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(argmax > -1)
|
|
||||||
{
|
|
||||||
if(argmax == candidate)
|
|
||||||
{
|
|
||||||
rounds ++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rounds = 0;
|
|
||||||
candidate = argmax;
|
|
||||||
}
|
|
||||||
if(rounds > 6)
|
|
||||||
{
|
|
||||||
rounds = 0;
|
|
||||||
active = candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -107,11 +107,14 @@ void BeatDetectApp::deinit()
|
|||||||
void BeatDetectApp::loop()
|
void BeatDetectApp::loop()
|
||||||
{
|
{
|
||||||
float sample = get_sample();
|
float sample = get_sample();
|
||||||
|
|
||||||
energy += std::abs(sample) * std::abs(sample);
|
energy += std::abs(sample) * std::abs(sample);
|
||||||
n_samples++;
|
n_samples++;
|
||||||
|
|
||||||
if (micros() - last_us_bp > sampling_period_bp)
|
if (micros() - last_us_bp > sampling_period_bp)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
n_samples = 0;
|
n_samples = 0;
|
||||||
last_us_bp = micros();
|
last_us_bp = micros();
|
||||||
// energy_fil += (energy - energy_fil) * 0.01;
|
// energy_fil += (energy - energy_fil) * 0.01;
|
||||||
@ -131,6 +134,7 @@ void BeatDetectApp::loop()
|
|||||||
// scheitelpunkte
|
// scheitelpunkte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float delays = constrain(SAMPLING_FREQUENCY_BP * 0.25 / (1.75 + active * (2.4 - 1.75) / n_BP),
|
float delays = constrain(SAMPLING_FREQUENCY_BP * 0.25 / (1.75 + active * (2.4 - 1.75) / n_BP),
|
||||||
4., 6.);
|
4., 6.);
|
||||||
|
|
||||||
@ -146,6 +150,8 @@ void BeatDetectApp::loop()
|
|||||||
|
|
||||||
angle = atan2(delayed, y[active]);
|
angle = atan2(delayed, y[active]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (PI < abs(angle - angle2) && abs(angle - angle2) < 3 * PI)
|
if (PI < abs(angle - angle2) && abs(angle - angle2) < 3 * PI)
|
||||||
{
|
{
|
||||||
angle2 = angle + 2 * PI;
|
angle2 = angle + 2 * PI;
|
||||||
@ -156,6 +162,9 @@ void BeatDetectApp::loop()
|
|||||||
}
|
}
|
||||||
|
|
||||||
pos_target = map(angle2, -PI, 3 * PI, -0.3 * NUM_LEDS, NUM_LEDS * 1.5);
|
pos_target = map(angle2, -PI, 3 * PI, -0.3 * NUM_LEDS, NUM_LEDS * 1.5);
|
||||||
|
//pos_target = NUM_LEDS * (sin(angle2)+1)/2;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (pos_target > pos_target_filtered)
|
if (pos_target > pos_target_filtered)
|
||||||
{
|
{
|
||||||
@ -167,6 +176,7 @@ void BeatDetectApp::loop()
|
|||||||
pos_target_filtered = pos_target;
|
pos_target_filtered = pos_target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
energy = 0;
|
energy = 0;
|
||||||
|
|
||||||
for (int i = 0; i < NUM_LEDS; i++)
|
for (int i = 0; i < NUM_LEDS; i++)
|
||||||
|
@ -109,6 +109,8 @@ void FftDetectApp::loop()
|
|||||||
y_fil = y_filter.update(std::abs(y), 0.005f);
|
y_fil = y_filter.update(std::abs(y), 0.005f);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float delayed = yy5;
|
float delayed = yy5;
|
||||||
angle = atan2(delayed, y);
|
angle = atan2(delayed, y);
|
||||||
|
|
||||||
@ -154,6 +156,20 @@ void FftDetectApp::loop()
|
|||||||
if (sample_counter == N_SAMPLES)
|
if (sample_counter == N_SAMPLES)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
float samplesum = 0.f;
|
||||||
|
for (int i = 0; i < N_SAMPLES;i++)
|
||||||
|
{
|
||||||
|
samplesum = samplesum + std::abs(samples[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sampleavg = samplesum/N_SAMPLES;
|
||||||
|
|
||||||
|
for (int i = 0; i < N_SAMPLES;i++)
|
||||||
|
{
|
||||||
|
samples[i] = samples[i] - sampleavg;
|
||||||
|
}
|
||||||
|
|
||||||
FFT<float>::fft(samples, z, N_SAMPLES);
|
FFT<float>::fft(samples, z, N_SAMPLES);
|
||||||
|
|
||||||
float max = 0.f;
|
float max = 0.f;
|
||||||
@ -161,21 +177,19 @@ void FftDetectApp::loop()
|
|||||||
for (int i = 20; i < 30; i++)
|
for (int i = 20; i < 30; i++)
|
||||||
{
|
{
|
||||||
float v = std::abs(z[i]);
|
float v = std::abs(z[i]);
|
||||||
|
|
||||||
if (v > max)
|
if (v > max)
|
||||||
{
|
{
|
||||||
max = v;
|
max = v;
|
||||||
pos = i;
|
pos = i;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
Serial.println(v);
|
||||||
|
}
|
||||||
|
|
||||||
float frequency = 40.f/512.f*pos;
|
float frequency = 40.f/512.f*pos;
|
||||||
set_filter(frequency);
|
set_filter(frequency);
|
||||||
sample_counter = 0;
|
sample_counter = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ std::vector<std::reference_wrapper<App>> apps = {
|
|||||||
std::ref<App>(fackel_app),
|
std::ref<App>(fackel_app),
|
||||||
std::ref<App>(fft_detect_app)};
|
std::ref<App>(fft_detect_app)};
|
||||||
|
|
||||||
unsigned int current_app = 4;
|
unsigned int current_app = 0;
|
||||||
unsigned int next_app;
|
unsigned int next_app;
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
Binary file not shown.
Binary file not shown.
BIN
inventor/OldVersions/Spant2.0001.ipt
Normal file
BIN
inventor/OldVersions/Spant2.0001.ipt
Normal file
Binary file not shown.
BIN
inventor/OldVersions/holz.0001.dwg
Normal file
BIN
inventor/OldVersions/holz.0001.dwg
Normal file
Binary file not shown.
BIN
inventor/OldVersions/lower_centering_ring.0001.ipt
Normal file
BIN
inventor/OldVersions/lower_centering_ring.0001.ipt
Normal file
Binary file not shown.
Binary file not shown.
BIN
inventor/OldVersions/top_centering_ring.0003.ipt
Normal file
BIN
inventor/OldVersions/top_centering_ring.0003.ipt
Normal file
Binary file not shown.
BIN
inventor/OldVersions/vase_v2._tom.0021.ipt
Normal file
BIN
inventor/OldVersions/vase_v2._tom.0021.ipt
Normal file
Binary file not shown.
Binary file not shown.
BIN
inventor/boden.ipt
Normal file
BIN
inventor/boden.ipt
Normal file
Binary file not shown.
BIN
inventor/holz.dwg
Normal file
BIN
inventor/holz.dwg
Normal file
Binary file not shown.
BIN
inventor/holz.pdf
Normal file
BIN
inventor/holz.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
inventor/~holz.dwg.14084.tmp
Normal file
BIN
inventor/~holz.dwg.14084.tmp
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user