Falls Ihnen die Audio-Pegel-Anzeige mit der 8×8 LED-Matrix nicht ausreicht, zeige ich Ihnen in diesem Artikel, wie Sie mit einem kleinen 128×32 Display ein Audio-Spektrum darstellen.
Wie die optische Darstellung des Spektrum aussehen soll, können Sie dabei selber festlegen. Meine Variante ist eine Balkendarstellung.
Voraussetzungen
Als Hardware brauchen Sie nur das Display selbst. Aber in der I2C Ausführung mit dem Treiber IC SSD1306.
Wie bei der 8×8 LED Matrix gibt es auch für das 128×32 Display eine Komponente von TMS Software. Wie Sie diese in Lazarus installieren, ist im Artikel 8×8 LED-Matrix mit Raspberry und Lazarus beschrieben.
In der Dokumenation von TMS steht, dass die Komponenten für die Hardware von adafruit entwickelt wurden. Sie funktionieren aber auch mit anderen Herstellern.
Ich verwende hier ein Display mit 128×64 Pixeln. Wobei sich leider nur 32 Zeilen ansprechen lassen. Aber auch das Ergebnis sieht ziemlich brauchbar aus.
Das Tolle ist, dass die Programmierung genauso funktioniert, wie Sie es bei der Pegel-Anzeige kennengelernt haben.
Die Verbindung zum Display erfolgt über die Komponente TTMSLCLAdaDispl128x32. In den Programmbeispielen verwende ich die Instanz display, damit der Schreibaufwand ein wenig kleiner wird.
Das Initialisieren funktioniert sehr ähnlich, wie bei der 8×8 LED Matrix. Die Adresse im I2C ist als Hexadezimalzahl 3C (als Dezimalzahl 60).
display.I2CAddress:=Hex2Dec('$3c'); display.Open; display.Clear;
Die Adresse können Sie mit dem Befehl i2cdetect -y 1 in einer Shell herausfinden.
MP3
Die Grundfunktionen für die MP3-Bearbeitung sind die gleichen, wie im vorherigen Artikel. Für die MP3-Ausgabe wird die BASS Bibliothek von un4seen.com verwendet.
Audio-Spektrum
Das Darstellen des Audio-Spektrums erfolgt über ein Timer-Ereignis. Als Timer-Intervall verwende ich 100 ms.
Um die passenden Daten parallel zur Soundausgabe zu bekommen, stellt die BASS Bibliothek die Funktion ChannelGetData bereit.
BASS_ChannelGetData(Channel, @FFTData, 1024);
Mit ein paar Anweisungen lassen sich aus den Daten ein Audio-Spektrum erzeugen.
//Bitmap für Bildschirm löschen
Bitmap.Canvas.Brush.Color:=clBlack;
Bitmap.Canvas.Pen.Color:=clBlack;
Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height);
Bitmap.Canvas.Pen.Color:=clWhite;
if CheckboxFilled.Checked=true then Bitmap.Canvas.Brush.Color:=clWhite;
j:=Round(128/SpinEditColWidth.Value);
if j*SpinEditColWidth.Value>127 then j:=j-1;
for i := 0 to j do begin
YVal:=Abs(FFTData[(i*1)+5]);
YPosI:=Trunc((YVal)*500);
if YPosI>MaxBar then MaxBar:=YPosI;
YPos:=conv(YPosI/MaxBar*SpecHeight);
if YPos>SpecHeight then YPos:=SpecHeight;
if YPos>=FFTPeacks[i] then FFTPeacks[i]:=YPos
else FFTPeacks[i]:=FFTPeacks[i]-PeakFall;
if YPos>=FFTFallOff[i] then FFTFallOff[i]:=YPos
else FFTFallOff[i]:=FFTFallOff[i]-LineFall;
if (SpecHeight-FFTPeacks[i])>SpecHeight then FFTPeacks[i]:=0;
if (SpecHeight-FFTFallOff[i])>SpecHeight then FFTFallOff[i]:=0;
//Ausgabe auf dem Display
if CheckboxFilled.Checked=true then
display.FillRect(X+(i*SpinEditColWidth.Value),Y+SpecHeight-FFTFallOff[i],
X+((i+1)*SpinEditColWidth.Value)-1-SpinEditGap.Value,Y+SpecHeight)
else
display.DrawRect(X+(i*SpinEditColWidth.Value),Y+SpecHeight-FFTFallOff[i],
X+((i+1)*SpinEditColWidth.Value)-1,Y+SpecHeight);
//Ausgabe auf dem Bildschirm
Bitmap.Canvas.Rectangle(X+(i*SpinEditColWidth.Value),Y+SpecHeight-FFTFallOff[i],
X+((i+1)*SpinEditColWidth.Value),Y+SpecHeight);
end;
//Bildschirm anzeigen
Panel1.Canvas.CopyRect(Rect(0,0,Bitmap.Width,Bitmap.Height),Bitmap.Canvas,
Rect(0,0,Bitmap.Width,Bitmap.Height));
//Display anzeigen
display.Display;
Für erste Tests laden Sie am besten die Beispiel-App herunter und schauen sich meine Spektrum-Anzeige an.
Viel Spaß beim Experimentieren!
Download
Quellcode der Beispiel-App Spektrum-Anzeige
(mit direkt lauffähiger Anwendung miniplayer2)
Links
BASS-Bibliothek für Lazarus: http://www.un4seen.com/
Die Grundroutine für meine Bildschirmdarstellung kommt aus dem Beispiel Spectrum Visualyzation von Alessandro Cappellozza das der BASS Bibliothek beiliegt.
Webseite von TMS-Software: https://www.tmssoftware.com/site/tmslclhwpack.asp
TMS Package auf github: https://github.com/tmssoftware/TMS-LCL-HW-Pack-for-Raspberry-Pi
Artikel 8×8 LED-Matrix mit Raspberry und Lazarus
Die MP3-Beispieldateien stammen von FRAMETRAXX: Kostenlose gemafreie Musik
Pingback: Audio spectrum with 128×32 display – Tech+Code