- Anzahl Lautstärkestufen != Anzahl LEDs Neopixel
Es gibt 21 Lautstärkestufen. Hier wäre eine Wählbare Anzahl, analog zur Anzahl LEDs beim Neopixel, wünschenswert. Denn standard sind 21 Lautstärkestufen ↔ 24 LEDs. Ich habe versucht, die 3 Definitionen* wo die 21 auftaucht, auf 24 zu ändern, das hat jedoch nicht funktioniert.
*Zeile 24 in AudioPlayer.cpp: #define AUDIOPLAYER_VOLUME_MAX 21u
*469+470 in lib → ESP32-audioI2S-master → src → Audio.h
uint16_t m_vol = 21; // volume default 21
uint8_t m_vol_steps = 21; // default default 21
- Neopixel - Darstellung des Fortschritts
Der aktuelle Fortschritt der Musikdatei erzeugt beim Neopixel viel zu wenig Helligkeitsunterschiede. Das resultiert entsprechend in einem „stottern“ statt halbwegs gleichmäßigem Fortschritt. Das liegt daran, dass die 50 definierten Helligkeitsstufen nicht korrekt berechnet werden. Ich habe per Serial die Werte ausgeben lassen, welche bestätigten, dass die Berechnung falsch ist:
millis: 30940, currentRelPos: 1.97, leds.size(): 24, DIMMABLE_STATES: 20, ledValue: 4, fullLeds: 0, lastLed: 4
millis: 30974, currentRelPos: 1.97, leds.size(): 24, DIMMABLE_STATES: 20, ledValue: 4, fullLeds: 0, lastLed: 4
millis: 31030, currentRelPos: 2.00, leds.size(): 24, DIMMABLE_STATES: 20, ledValue: 9, fullLeds: 0, lastLed: 9
millis: 31052, currentRelPos: 2.00, leds.size(): 24, DIMMABLE_STATES: 20, ledValue: 9, fullLeds: 0, lastLed: 9
millis: 89694, currentRelPos: 6.99, map(): 29, leds.size() * DIMMABLE_STATES: 480, ledValue: 29
millis: 89744, currentRelPos: 7.00, map(): 34, leds.size() * DIMMABLE_STATES: 480, ledValue: 34
[...]
millis: 101237, currentRelPos: 7.99, map(): 34, leds.size() * DIMMABLE_STATES: 480, ledValue: 34
millis: 101262, currentRelPos: 8.01, map(): 39, leds.size() * DIMMABLE_STATES: 480, ledValue: 39
Das Problem liegt also in der map() Funktion. Diese springt immer dann, wenn currentRelPos genau die nächste ganze Zahl erreicht. Also irgendwas integer basiertes. Daher eigene map geschrieben:
float ratio = (gPlayProperties.currentRelPos - 0) / (98 - 0);
uint32_t mappedValue = ratio * (leds.size() * DIMMABLE_STATES - 0) + 0;
const uint32_t ledValue = std::clamp<uint32_t>(mappedValue, 0, leds.size() * DIMMABLE_STATES);
Mit Output:
millis: 62891, currentRelPos: 4.90, ratio: 0.05, mappedValue: 23, ledValue: 23
millis: 62940, currentRelPos: 4.92, ratio: 0.05, mappedValue: 24, ledValue: 24
[...]
millis: 65400, currentRelPos: 5.10, ratio: 0.05, mappedValue: 24, ledValue: 24
millis: 65422, currentRelPos: 5.14, ratio: 0.05, mappedValue: 25, ledValue: 25
[...]
millis: 67433, currentRelPos: 5.29, ratio: 0.05, mappedValue: 25, ledValue: 25
millis: 67456, currentRelPos: 5.31, ratio: 0.05, mappedValue: 26, ledValue: 26
→ Funktioniert, flüssiger Übergang der Helligkeiten mit dem eingestellten Wert der Helligkeitsstufen DIMMABLE_STATES
.
Soll ich das bei Github als Issue eintragen? Oder wie kann ich denn korrigierten Code sogar hochladen?