Browse Source

Initial commit

master
The Dod 2 years ago
commit
11ace92b26
5 changed files with 220 additions and 0 deletions
  1. 6
    0
      README.md
  2. BIN
      dotstar-pixel-organ.fzz
  3. 107
    0
      dotstar-pixel-organ.ino
  4. BIN
      dotstar-pixel-organ_bb.png
  5. 107
    0
      seeeduino-pixel-organ.ino

+ 6
- 0
README.md View File

@@ -0,0 +1,6 @@
1
+Microphone's Low/Mid/High affect an [Adafruit DotStar](https://learn.adafruit.com/adafruit-dotstar-leds/overview) LED strip.
2
+
3
+![Schematics](dotstar-pixel-organ_bb.png)
4
+
5
+[Video](https://zzzen.com/kraftz/2021-11-16%20-%20pixel%20organ.webm)
6
+

BIN
dotstar-pixel-organ.fzz View File


+ 107
- 0
dotstar-pixel-organ.ino View File

@@ -0,0 +1,107 @@
1
+#include <Adafruit_DotStar.h>
2
+#include <SPI.h>         // COMMENT OUT THIS LINE FOR GEMMA OR TRINKET
3
+
4
+#define DEBUG true
5
+
6
+#define NUMPIXELS 72 // Number of LEDs in strip
7
+#define DATAPIN    4
8
+#define CLOCKPIN   5
9
+#define DECAYFACTOR 0.95
10
+Adafruit_DotStar strip = Adafruit_DotStar(
11
+                           NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
12
+
13
+#define MICPIN   A0 // microphone
14
+//Turns out QUIETPIN is not that important
15
+//#define QUIETPIN A1 // potentiometer to determine "quiet" level (no output below this)
16
+#define LOUD 768    // constant. Higher than that means compress to 0..255
17
+#define BUFFSIZE 96 // at least NUMPIXELS!
18
+#define AVGSIZE 5
19
+#define MILLI_AMNESIA 23 // How much to "falsely remeber" current value as history (1..999)
20
+int rawBuff[BUFFSIZE];
21
+int notHighBuff[BUFFSIZE];
22
+int lowBuff[BUFFSIZE];
23
+int index, minLow, maxLow, minMid, maxMid, minHigh, maxHigh, dynRange;
24
+
25
+#define rawLow(i) (lowBuff[i])
26
+#define rawMid(i) (notHighBuff[i]-lowBuff[i])
27
+#define rawHigh(i) (rawBuff[i]-notHighBuff[i])
28
+#define normLow(i) map(rawLow(i),minLow,maxLow,0,dynRange)
29
+#define normMid(i) map(rawMid(i),minMid,maxMid,0,dynRange)
30
+#define normHigh(i) map(rawHigh(i),minHigh,maxHigh,0,dynRange)
31
+
32
+unsigned long lastTime, thisTime;
33
+
34
+void setup() {
35
+  if (DEBUG) {
36
+    Serial.begin(230400);
37
+  }
38
+  lastTime = millis();
39
+  index = 0;
40
+  strip.begin(); // Initialize pins for output
41
+  strip.show();  // Turn all LEDs off ASAP
42
+  for (int i = 0; i < BUFFSIZE; i++) {
43
+    rawBuff[i] = notHighBuff[i] = lowBuff[i] = 512;
44
+  }
45
+}
46
+
47
+
48
+void loop() {
49
+  thisTime = millis();
50
+  unsigned long rate = 1000 / max(thisTime - lastTime, 1);
51
+  rawBuff[index] = analogRead(MICPIN);
52
+  notHighBuff[index] = 0;
53
+  int nextIndex = (index + 1) % BUFFSIZE;
54
+  for (int i = nextIndex + BUFFSIZE - AVGSIZE; i % BUFFSIZE != nextIndex; i++) {
55
+    notHighBuff[index] += rawBuff[i % BUFFSIZE];
56
+  }
57
+  notHighBuff[index] /= AVGSIZE;
58
+  lowBuff[index] = (notHighBuff[index] + notHighBuff[(index + BUFFSIZE - AVGSIZE) % BUFFSIZE]) / 2;
59
+  minLow = minMid = minHigh = 1024;
60
+  maxLow = maxMid = maxHigh = -1;
61
+  long pseudoRaw = rawBuff[index] * MILLI_AMNESIA;
62
+  long pseudoNotHigh = notHighBuff[index] * MILLI_AMNESIA;
63
+  long pseudoLow = lowBuff[index] * MILLI_AMNESIA;
64
+  for (int i = 0; i < BUFFSIZE; i++) {
65
+    rawBuff[i] = (long(rawBuff[i] * long(1000 - MILLI_AMNESIA) + pseudoRaw)) / 1000;
66
+    notHighBuff[i] = (long(notHighBuff[i] * long(1000 - MILLI_AMNESIA) + pseudoNotHigh)) / 1000;
67
+    lowBuff[i] = (long(lowBuff[i] * long(1000 - MILLI_AMNESIA) + pseudoLow)) / 1000;
68
+    minLow =   min(minLow, rawLow(i));
69
+    minMid =   min(minMid, rawMid(i));
70
+    minHigh =  min(minHigh, rawHigh(i));
71
+    maxLow =   max(maxLow, rawLow(i));
72
+    maxMid =   max(maxMid, rawMid(i));
73
+    maxHigh =  max(maxHigh, rawHigh(i));
74
+  }
75
+  int quiet = LOUD / 5; // was: map(analogRead(QUIETPIN), 0, 1024, 0, LOUD * 7 / 8);
76
+  dynRange = constrain(
77
+               map(max(maxLow, max(maxMid, maxHigh)) - min(minLow, min(minMid, minHigh)),
78
+                   quiet, LOUD, 0, 255),
79
+               0, 255);
80
+
81
+  int buffIndex = index;
82
+  float ledFactor = 1.0;
83
+  for (int i = 0;  i < NUMPIXELS; i++) {
84
+    uint32_t rgb = uint32_t(
85
+                     ((uint32_t(float(normHigh(buffIndex)) * ledFactor) << 8) +
86
+                      uint32_t(float(normMid(buffIndex)) * ledFactor) << 8) +
87
+                     uint32_t(float(normLow(buffIndex)) * ledFactor));
88
+    strip.setPixelColor(NUMPIXELS - i, rgb);
89
+    buffIndex = (buffIndex + BUFFSIZE - 1) % BUFFSIZE;
90
+    ledFactor *= DECAYFACTOR;
91
+  }
92
+  strip.show();
93
+  if (DEBUG) {
94
+    Serial.print(dynRange);
95
+    Serial.print(' ');
96
+    Serial.print(normLow(index));
97
+    Serial.print(' ');
98
+    Serial.print(normMid(index));
99
+    Serial.print(' ');
100
+    Serial.print(normHigh(index));
101
+    Serial.print(' ');
102
+    Serial.print('\n');
103
+  }
104
+  index = nextIndex;
105
+  lastTime = thisTime;
106
+  delay(1); // this is considered good manners ;)
107
+}

BIN
dotstar-pixel-organ_bb.png View File


+ 107
- 0
seeeduino-pixel-organ.ino View File

@@ -0,0 +1,107 @@
1
+#include <Adafruit_DotStar.h>
2
+#include <SPI.h>         // COMMENT OUT THIS LINE FOR GEMMA OR TRINKET
3
+
4
+#define DEBUG true
5
+
6
+#define NUMPIXELS 72 // Number of LEDs in strip
7
+#define DATAPIN    4
8
+#define CLOCKPIN   5
9
+#define DECAYFACTOR 0.95
10
+Adafruit_DotStar strip = Adafruit_DotStar(
11
+                           NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
12
+
13
+#define MICPIN   A0 // microphone
14
+//Turns out QUIETPIN is not that important
15
+//#define QUIETPIN A1 // potentiometer to determine "quiet" level (no output below this)
16
+#define LOUD 768    // constant. Higher than that means compress to 0..255
17
+#define BUFFSIZE 96 // at least NUMPIXELS!
18
+#define AVGSIZE 5
19
+#define MILLI_AMNESIA 23 // How much to "falsely remeber" current value as history (1..999)
20
+int rawBuff[BUFFSIZE];
21
+int notHighBuff[BUFFSIZE];
22
+int lowBuff[BUFFSIZE];
23
+int index, minLow, maxLow, minMid, maxMid, minHigh, maxHigh, dynRange;
24
+
25
+#define rawLow(i) (lowBuff[i])
26
+#define rawMid(i) (notHighBuff[i]-lowBuff[i])
27
+#define rawHigh(i) (rawBuff[i]-notHighBuff[i])
28
+#define normLow(i) map(rawLow(i),minLow,maxLow,0,dynRange)
29
+#define normMid(i) map(rawMid(i),minMid,maxMid,0,dynRange)
30
+#define normHigh(i) map(rawHigh(i),minHigh,maxHigh,0,dynRange)
31
+
32
+unsigned long lastTime, thisTime;
33
+
34
+void setup() {
35
+  if (DEBUG) {
36
+    Serial.begin(230400);
37
+  }
38
+  lastTime = millis();
39
+  index = 0;
40
+  strip.begin(); // Initialize pins for output
41
+  strip.show();  // Turn all LEDs off ASAP
42
+  for (int i = 0; i < BUFFSIZE; i++) {
43
+    rawBuff[i] = notHighBuff[i] = lowBuff[i] = 512;
44
+  }
45
+}
46
+
47
+
48
+void loop() {
49
+  thisTime = millis();
50
+  unsigned long rate = 1000 / max(thisTime - lastTime, 1);
51
+  rawBuff[index] = analogRead(MICPIN);
52
+  notHighBuff[index] = 0;
53
+  int nextIndex = (index + 1) % BUFFSIZE;
54
+  for (int i = nextIndex + BUFFSIZE - AVGSIZE; i % BUFFSIZE != nextIndex; i++) {
55
+    notHighBuff[index] += rawBuff[i % BUFFSIZE];
56
+  }
57
+  notHighBuff[index] /= AVGSIZE;
58
+  lowBuff[index] = (notHighBuff[index] + notHighBuff[(index + BUFFSIZE - AVGSIZE) % BUFFSIZE]) / 2;
59
+  minLow = minMid = minHigh = 1024;
60
+  maxLow = maxMid = maxHigh = -1;
61
+  long pseudoRaw = rawBuff[index] * MILLI_AMNESIA;
62
+  long pseudoNotHigh = notHighBuff[index] * MILLI_AMNESIA;
63
+  long pseudoLow = lowBuff[index] * MILLI_AMNESIA;
64
+  for (int i = 0; i < BUFFSIZE; i++) {
65
+    rawBuff[i] = (long(rawBuff[i] * long(1000 - MILLI_AMNESIA) + pseudoRaw)) / 1000;
66
+    notHighBuff[i] = (long(notHighBuff[i] * long(1000 - MILLI_AMNESIA) + pseudoNotHigh)) / 1000;
67
+    lowBuff[i] = (long(lowBuff[i] * long(1000 - MILLI_AMNESIA) + pseudoLow)) / 1000;
68
+    minLow =   min(minLow, rawLow(i));
69
+    minMid =   min(minMid, rawMid(i));
70
+    minHigh =  min(minHigh, rawHigh(i));
71
+    maxLow =   max(maxLow, rawLow(i));
72
+    maxMid =   max(maxMid, rawMid(i));
73
+    maxHigh =  max(maxHigh, rawHigh(i));
74
+  }
75
+  int quiet = LOUD / 5; // was: map(analogRead(QUIETPIN), 0, 1024, 0, LOUD * 7 / 8);
76
+  dynRange = constrain(
77
+               map(max(maxLow, max(maxMid, maxHigh)) - min(minLow, min(minMid, minHigh)),
78
+                   quiet, LOUD, 0, 255),
79
+               0, 255);
80
+
81
+  int buffIndex = index;
82
+  float ledFactor = 1.0;
83
+  for (int i = 0;  i < NUMPIXELS; i++) {
84
+    uint32_t rgb = uint32_t(
85
+                     ((uint32_t(float(normHigh(buffIndex)) * ledFactor) << 8) +
86
+                      uint32_t(float(normMid(buffIndex)) * ledFactor) << 8) +
87
+                     uint32_t(float(normLow(buffIndex)) * ledFactor));
88
+    strip.setPixelColor(NUMPIXELS - i, rgb);
89
+    buffIndex = (buffIndex + BUFFSIZE - 1) % BUFFSIZE;
90
+    ledFactor *= DECAYFACTOR;
91
+  }
92
+  strip.show();
93
+  if (DEBUG) {
94
+    Serial.print(dynRange);
95
+    Serial.print(' ');
96
+    Serial.print(normLow(index));
97
+    Serial.print(' ');
98
+    Serial.print(normMid(index));
99
+    Serial.print(' ');
100
+    Serial.print(normHigh(index));
101
+    Serial.print(' ');
102
+    Serial.print('\n');
103
+  }
104
+  index = nextIndex;
105
+  lastTime = thisTime;
106
+  delay(1); // this is considered good manners ;)
107
+}

Loading…
Cancel
Save