Audio-Spektrum mit 128×32 Display

Audio-Spektrum mit 128x32 Display

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.

128x64 Display für das Audio-Spektrum
Beispiel für ein 128×64 Display mit SSD1306 Treiber IC

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.

Komponente TMSLCLAdaDispl128x32 für die Anzeige des Audio-Spektrums
Komponente TTMSLCLAdaDispl128x32

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

Beispiel-App erstellt mit Lazarus
Beispiel-App miniplayer2

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


Click here to read this in English.

Dieser Beitrag hat einen Kommentar

Kommentar verfassen