Player für Liveradio und Onlinestreams im Internet.
Hallo liebe AHKler,
da ich keinen 100% zufriedenstellenden Streamplayer in den Foren finden konnte, entstand die Idee zur Umsetzung eines einfachen und kleinen OnlineRadios auf Basis von Bass.dll.
Vorab schon mal vielen herzlichen Dank an un4seen.com (bass.dll), toralf (bass-wrapper), k3ph (Bass-library) und noname (gdip / bass.dll radio stream player) für dessen Ideen/Entwicklungen/Postings.
Das StreamBAR Onlineradio wurde bislang jedoch nur unter Windows 10 Pro 64 Bit getestet und benötigt noch folgende Dateien:
http://www.un4seen.com - Download Bass24.zip entpacke nur bass.dll (32 Bit) oder \ x64 \ bass.dll (64 Bit)... Achtung: nicht mit falscher bass.dll kompilieren!!!
jetzt hier downloaden: StreamBAR.zip
StreamBAR.ahk
Code: Select all
[code]/*
⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊⯊
==============================================================================================
Title .........: ⯈ StreamBAR v1.0 ♫
AHK Version ...: 1.1.24.02 x64 Unicode
Win Version ...: Windows 10 Professional x64 / 1607 Build 14393.447
Description ...: Player für Liveradio und Onlinestreams im Internet
Version .......: v1.00 (64 Bit)
Modified ......: 2016-11-17 17:10:36
Author(s) .....: moefr01
Thanks to .....: BASS.dll (www.un4seen.com), toralf (BASS-wrapper), k3ph (BASS library), noname
(gdip/bass.dll radiostream player ....for inspiration), all unnamed AHKmembers
for code-snippets and inspiration ☺
==============================================================================================
⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋⯋
*/
; Globale Einstellungen
#NoEnv
#Persistent
#NoTrayIcon
#SingleInstance Force
SetBatchLines -1
SendMode Input
SetWorkingDir %A_ScriptDir%
;=============================================================================================
; Fensternachrichten definieren
OnMessage(0x201, "OnLeftClick") ; Fenster verschieben bei Linksklick
OnMessage(0x200, "OnMouseMove") ; Mausbewegung über Controls erkennen
OnMessage(0x0020, "OnSetCursor") ; GUI-Fenster mit Schatten erzeugen: Resize-Cursor(s) deaktivieren
OnMessage(0xA4, "OnTitlebarClick") ; Fenster aus/einblenden bei Rechtsklick Fenstertitelleiste
;=============================================================================================
; config_SB.ini-Parameter lesen
IfNotExist, %A_ScriptDir%\config_SB.ini
ExitApp
IniRead, xPos, %A_ScriptDir%\config_SB.ini, StreamBAR, xPos
IniRead, yPos, %A_ScriptDir%\config_SB.ini, StreamBAR, yPos
IniRead, top, %A_ScriptDir%\config_SB.ini, StreamBAR, top
IniRead, symbol, %A_ScriptDir%\config_SB.ini, StreamBAR, symbol
IniRead, sender_font, %A_ScriptDir%\config_SB.ini, StreamBAR, sender_font
IniRead, sender_fontstyle, %A_ScriptDir%\config_SB.ini, StreamBAR, sender_fontstyle
IniRead, sender_fontsize, %A_ScriptDir%\config_SB.ini, StreamBAR, sender_fontsize
IniRead, sender_y, %A_ScriptDir%\config_SB.ini, StreamBAR, sender_y
IniRead, title_font, %A_ScriptDir%\config_SB.ini, StreamBAR, title_font
IniRead, title_fontstyle, %A_ScriptDir%\config_SB.ini, StreamBAR, title_fontstyle
IniRead, title_fontsize, %A_ScriptDir%\config_SB.ini, StreamBAR, title_fontsize
IniRead, title_y, %A_ScriptDir%\config_SB.ini, StreamBAR, title_y
IniRead, list_font, %A_ScriptDir%\config_SB.ini, StreamBAR, list_font
IniRead, list_fontstyle, %A_ScriptDir%\config_SB.ini, StreamBAR, list_fontstyle
IniRead, list_fontsize, %A_ScriptDir%\config_SB.ini, StreamBAR, list_fontsize
IniRead, list_distance, %A_ScriptDir%\config_SB.ini, StreamBAR, list_distance
IniRead, list_width, %A_ScriptDir%\config_SB.ini, StreamBAR, list_width
IniRead, list_x, %A_ScriptDir%\config_SB.ini, StreamBAR, list_x
IniRead, list_y, %A_ScriptDir%\config_SB.ini, StreamBAR, list_y
IniRead, list_rows, %A_ScriptDir%\config_SB.ini, StreamBAR, list_rows
IniRead, color_back, %A_ScriptDir%\config_SB.ini, StreamBAR, color_back
IniRead, color_sender, %A_ScriptDir%\config_SB.ini, StreamBAR, color_sender
IniRead, color_title, %A_ScriptDir%\config_SB.ini, StreamBAR, color_title
IniRead, color_shadow, %A_ScriptDir%\config_SB.ini, StreamBAR, color_shadow
IniRead, color_level, %A_ScriptDir%\config_SB.ini, StreamBAR, color_level
IniRead, color_levelback, %A_ScriptDir%\config_SB.ini, StreamBAR, color_levelback
IniRead, color_button, %A_ScriptDir%\config_SB.ini, StreamBAR, color_button
IniRead, scroll_len, %A_ScriptDir%\config_SB.ini, StreamBAR, scroll_len
IniRead, scroll_wait, %A_ScriptDir%\config_SB.ini, StreamBAR, scroll_wait
IniRead, tooltip_wait, %A_ScriptDir%\config_SB.ini, StreamBAR, tooltip_wait
IniRead, alpha, %A_ScriptDir%\config_SB.ini, StreamBAR, alpha
IniRead, shadow, %A_ScriptDir%\config_SB.ini, StreamBAR, shadow
IniRead, logo, %A_ScriptDir%\config_SB.ini, StreamBAR, logo
IniRead, gradient, %A_ScriptDir%\config_SB.ini, StreamBAR, gradient
IniRead, volume, %A_ScriptDir%\config_SB.ini, StreamBAR, volume
IniRead, fade, %A_ScriptDir%\config_SB.ini, StreamBAR, fade
IniRead, level_rate, %A_ScriptDir%\config_SB.ini, StreamBAR, level_rate
IniRead, level_meter, %A_ScriptDir%\config_SB.ini, StreamBAR, level_meter
;=============================================================================================
; sender_liste.txt lesen, DDL-Liste (Sendernamen) erzeugen, Sendername aus A_Index=1
Loop, Read, sender_list.txt
{
Loop, parse, A_LoopReadLine, |
{
if A_Index = 1
sender_namen = %sender_namen%|%A_LoopField%
}
}
sender_namen := LTrim(sender_namen,"|") ; "|" Separator am Anfang löschen
; zuletzt-gespielte sendernumber
IniRead, sendernumber, %A_ScriptDir%\config_SB.ini, StreamBAR, sendernumber
; Felder auslesen (1=Sendername, 2=Senderadresse)
FileReadLine, senderzeile, sender_list.txt, %sendernumber%
array := StrSplit(senderzeile, "|")
sendername := array[1]
senderadr := array[2]
senderloc := array[3]
sendergenre := array[4]
senderrate := array[5]
;=============================================================================================
; Parameter anpassen
if xPos = ; falls xPos ohne Wert, Positionen auf 100 setzen
xPos := 100, yPos := 100
if top = 1 ; falls top = 1, Fenster auf AlwaysOnTop setzen
alwaysontop = +AlwaysOnTop
if symbol = 0 ; falls symbol = 0, kein Taskleistensymbol anzeigen
owner = +Owner
textx = 10 ; Sender/TitelText x-Einrückung
if level_meter = 1 ; bei level_meter = 1, um +10 nach rechts rücken
textx += 10
textx0 := textx + 0 ; Schatten-Titeltext horizontal versetzen
title_y0 := title_y + 2 ; Schatten-Titeltext vertikal versetzen
;=============================================================================================
; GUI erzeugen und anzeigen, diverse Controls abfragen:
Gui, +Resize +MinSize +MaxSize +hwndStreamBAR %Owner% ; GUI definieren
Gui, Color, %color_back% ; Hintergrundfarbe
Gui, Add, Picture, x600 y0 vsender_pic BackgroundTrans, ; Senderlogo
If gradient = 1 ; Hintergrundverlaufsbild
Gui, Add, Picture, x0 y30 w580 h37 vBackgroundpic BackgroundTrans, HG_gradient.png
Else
Gui, Add, Picture, x0 y0 w0 h0 vBackgroundpic BackgroundTrans, ; ohne Hintergrundverlaufsbild, Static2
Gui, Add, Picture, x%textx% y31 w400 h30 vshadowline BackgroundTrans, shadowline.png ; Schattenlinie
Gui, Font
Gui, Font, s7, Segoe Print
Gui, Add, Text, x566 y1 w12 h12 R1 +0x0200 c%color_button% gExit vExitbutton BackgroundTrans, ⭙ ; Exit-Knopf
Gui, Font
Gui, Font, s%sender_fontsize% %sender_fontstyle%, %sender_font% ; Font für Sender
Gui, Add, Text, x%textx% y%sender_y% w422 h36 R1 -wrap +0x0200 c%color_sender% vtext_sender BackgroundTrans, ; Sender
if level_meter = 1 ; Level-meter
{
Gui, Add, Progress, x2 y2 w6 h58 vlevel_l +Vertical c%color_level% Background%color_levelback% Range0-32678, 0
Gui, Add, Progress, x7 y2 w6 h58 vlevel_r +Vertical c%color_level% Background%color_levelback% Range0-32678, 0
}
Gui, Font
Gui, Font, s%title_fontsize% %title_fontstyle%, %title_font% ; Font für Title
if shadow = 1 ; Title mit Schatten, vertikal zentriert
Gui, Add, Text, x%textx0% y%title_y0% w550 h36 R1 -wrap +0x0200 c%color_shadow% vtext_title0 BackgroundTrans, % title
Else
Gui, Add, Text, x0 y0 w0 h0 vtext_title0 BackgroundTrans, ; Title ohne Schatten
Gui, Add, Text, x%textx% y%title_y% w550 h36 R1 -wrap +0x0200 c%color_title% vtext_title BackgroundTrans, % title ; Title Vordergrund, vertikal zentriert
Gui, Font
Gui, Font, s%list_fontsize% %list_fontstyle%, %list_font% ; Font für DDL
Gui, Add, DDL, x%list_x% y%list_y% w%list_width% +0x0800 vddl_sender gDDL_Auswahl %sort% hwndhDDL -VScroll R%list_rows% Choose%sendernumber%, %sender_namen%
PostMessage, 0x153, -1, 0, , AHK_ID %hDDL% ; Höhe der Eingabezeile oben
PostMessage, 0x153, 0, %list_distance%, , AHK_ID %hDDL% ; Abstandshöhe der Listeneinträge
Gui, Add, Button, x0 y0 w0 h0 vGobutton gGo ; Dummy-Button (DDL-Listenauswahl)
Gui, Show, x%xPos% y%yPos% w578 h37, StreamBAR ; GUI anzeigen
Gui, -Caption %alwaysontop% ; Fenster mit Rahmen und Schatten
;=============================================================================================
; Neustart Einsprungpunkt
Restart:
if logo = 1
{
IfExist logos\%sendername%.png
{
senderlogo = %sendername%.png
GuiControl, Show, sender_pic
}
else
GuiControl, Hide, sender_pic
}
GuiControl, , sender_pic, *w0 *h0 %A_ScriptDir%\logos\%senderlogo%
GuiControlGet, sender_pic, Pos ; Senderlogo positionieren
GuiControl, Move, sender_pic, % "x" (980 - sender_picW) / 2 "y" (62 - sender_picH) / 2
GuiControl, , text_sender, %sendername% ; Sendername
GuiControl, , text_sender0, %sendername% ; Sendername Schattentext
;=============================================================================================
; Timer für level-meter, title, scrolling
SetTimer, get_level, %level_rate% ; Levelmeterabfrage: optimal = 20 ms
SetTimer, get_title, 5000 ; Titeltextabfrage: optimal = 5000 ms
SetTimer, scroll_title, %scroll_wait% ; Scrolling text_title Umschaltintervall
;=============================================================================================
; BASS.dll von http://www.un4seen.com/
; Download: bass24.zip ...... 64Bit-Version: bass24\x64\bass.dll in das Scriptverzeichnis entpacken
; BASS.dll-ChannelTags aus dem Stream holen
BASS_ChannelGetTags(hStream, tags, return_type := "AStr")
{
Return DllCall("bass.dll\BASS_ChannelGetTags", "UInt", hStream, "UInt", tags, return_type)
}
BASS_DLLCALL := DllCall("LoadLibrary", "Str", A_ScriptDir . "\bass.dll")
if (DllCall("bass.dll\BASS_Init", "Int", -1, "UInt", 44100, "UInt", 0, "Ptr", A_ScriptHwnd, "Ptr", 0))
{
hStream := DllCall("bass.dll\BASS_StreamCreateURL", "Str", senderadr, "UInt", 0, "UInt", A_IsUnicode ? BASS_UNICODE := 0x80000000 : 0, "Ptr", 0, "Ptr", 0, "UInt")
DllCall("bass.dll\BASS_ChannelPlay", "UInt", hStream, "Int", 1) ; Stream abspielen
DllCall("bass.dll\BASS_ChannelSlideAttribute", UInt, hStream, UInt, 2, Float, 0, UInt, 0) ; Volume ausblenden auf 0 in 0 msec
DllCall("bass.dll\BASS_ChannelSlideAttribute", UInt, hStream, UInt, 2, Float, 2, UInt, fade*4) ; Volume einblenden auf 2 in fade*4 msec
get_title: ; Titel holen
title_old := title
if (tag := BASS_ChannelGetTags(hStream, BASS_TAG_META := 5))
{
tags := StrSplit(tag, ";")
Loop % tags.MaxIndex()
{
if (InStr(tags[A_Index], "StreamTitle="))
{
title:= StrSplit(tags[A_Index], "=", "'")[2]
break
}
}
if (title != title_old)
{
StringReplace, title, title, ä, ä, All ; StringReplacements
StringReplace, title, title, Ã`,, Ä, All
StringReplace, title, title, �, ö, All
StringReplace, title, title, Ãœ, Ü, All
StringReplace, title, title, ö, ö, All
StringReplace, title, title, Õ, Ø, All
StringReplace, title, title, ü, ü, All
StringReplace, title, title, ß, ß, All
StringReplace, title, title, è, è, All
StringReplace, title, title, é, é, All
StringReplace, title, title, &, &&, All
if shadow = 1
{
GuiControl, +Left, text_title0
GuiControl, , text_title0, %title%
}
GuiControl, +Left, text_title
GuiControl, , text_title, %title% ; Titeltext
}
Return
}
get_level: ; Level (L+R) holen
BASS_GetLevel(hStream, LeftLevel, RightLevel)
GuiControl, , level_r, %RightLevel%
GuiControl, , level_l, %LeftLevel%
Return
scroll_title: ; Scrolling abhängig von Stringlänge
StringLen, title_len, title
If (title_len > scroll_len)
{
If scrollstate = 0
{
GuiControl, +Right, text_title0
GuiControl, , text_title0, %title%
GuiControl, +Right, text_title
GuiControl, , text_title, %title%
scrollstate = 1
}
Else
{
GuiControl, +Left, text_title0
GuiControl, , text_title0, %title%
GuiControl, +Left, text_title
GuiControl, , text_title, %title%
scrollstate = 0
}
}
Return
}
;=============================================================================================
; liefert Level zurück (peak amplitude 0-32768), bei Fehler: -1 oder bei Abriss: 0
BASS_GetLevel(hStream, Byref LeftLevel, Byref RightLevel){
If ((LevelDWord := DllCall("bass.dll\BASS_ChannelGetLevel", UInt, hStream)) = -1)
ErrorLevel := 0
If (LevelDWord > 0) {
LeftLevel := LevelDWord & 0xffff ; linker Kanal: low word 16-bits
RightLevel := (LevelDWord >> 16) & 0xffff ; rechter Kanal: high word 16-bits
}Else{
LeftLevel = 0
RightLevel = 0
}
Return
}
;=============================================================================================
; DropDownListe öffnen und Auswahl holen
DDL_Auswahl:
Gui, Submit, NoHide
send, {tab} {enter} ; Auswahl mit [ok] bestätigen
Return
;=============================================================================================
; GUI verschieben mit gehaltener linker Maustaste
OnLeftClick()
{
PostMessage, 0xA1, 2
ToolTip ; aktive ToolTips löschen
}
Return
;=============================================================================================
; Rechtsklick auswerten: Sender/Logo=Senderliste, Levelmeter=Fensterposition, Titel=ToolTip vom Titel
GuiContextMenu:
If (A_GuiControl = "text_title" or A_GuiControl = "shadowline") ; TitelText- und Schattenlinie-Rechtsklick
{
StringReplace, title_tt, title, &&, &
ToolTip,
(LTrim
Titel:`t%title_tt%
Sender:`t%sendername%
Ort:`t%senderloc%
Genre:`t%sendergenre%
Bitrate:`t%senderrate% kbps
), 28, 75
SetTimer, ToolTipRemove, %tooltip_wait%
}
If (A_GuiControl = "level_l" or A_GuiControl = "level_r") ; Level_meter L+R-Rechtsklick
{
ToolTip,
(LTrim
S t r e a m B A R v1.0
⯈ Player für Liveradio und Onlinestreams im Internet.
–––––––––––––––––––––––––––––––––––––––––––––––––––––
Info`t`t= Levelmeter rechtsklicken
Senderauswahl`t= Sendernamen oder Logo rechtsklicken
Titel-Info`t= Titel rechtsklicken
Transparenz`t= Fenstertitelleiste rechtsklicken (-/+)
Lautstärke`t= Mausrad über StreamBAR drehen
Beenden`t`t= ⭙-Symbol klicken
–––––––––––––––––––––––––––––––––––––––––––––––––––––
coded 2016 by:`tmoefr01
many thanx to:`ttoralf, k3ph, noname, un4seen.com
), 28, 75
SetTimer, ToolTipRemove, %tooltip_wait%
Return
}
If (A_GuiControl = "text_sender" or A_GuiControl = "sender_pic") ; SenderText-/logo-Rechtsklick
{
if ddl_state = off
{
ToolTip,
GuiControl, Move, ddl_sender, x%list_x%
GuiControl, Show, ddl_sender
GuiControl, Show, GoButton
ddl_state = on
send, {tab}{F4}
}
Else
{
GuiControl, Hide, ddl_sender
GuiControl, Hide, GoButton
ddl_state = off
send, {F4}{RButton}
}
}
Return
;=============================================================================================
; sendernumber aus Liste holen
Go:
; keys abfragen und blättern verhindern
GetKeyState, state, Right
if state = D
Return
GetKeyState, state, Left
if state = D
Return
GetKeyState, state, Down
if state = D
Return
GetKeyState, state, Up
if state = D
Return
GetKeyState, state, PgUp
if state = D
Return
GetKeyState, state, PgDn
if state = D
Return
; Audiostream mit fadeWert ausblenden (std = 2000 msec)
DllCall("bass.dll\BASS_ChannelSlideAttribute", UInt, hStream, UInt, 2, Float, 0, UInt, fade)
DllCall("Sleep", "UInt", fade)
; sendernumber holen
GuiControl, +AltSubmit, ddl_sender
Gui, Submit, NoHide
GuiControlGet, sendernumber, , ddl_sender
; Felder auslesen (1=Sendername, 2=Senderadresse)
FileReadLine, senderzeile, sender_list.txt, %sendernumber%
array := StrSplit(senderzeile, "|")
sendername := array[1]
senderadr := array[2]
senderloc := array[3]
sendergenre := array[4]
senderrate := array[5]
DllCall("bass.dll\BASS_Free") ; BASS.dll zurücksetzen
; Neustart ausführen
Goto Restart
;=============================================================================================
; Hover-Abfrage
OnMouseMove()
{
global
IfWinNotActive, ahk_exe StreamBAR.exe
Return
If (A_GuiControl = "ExitButton") ; Exit Hoverabfrage
{
If exitSet
Return
GuiControl, , Exitbutton, ⬤ ; chr(11044)
exitSet := True
} Else If exitSet
{
GuiControl, , Exitbutton, ⭙ ; chr(11097)
exitSet := False
}
Return
}
;=============================================================================================
; Programm beenden
Exit:
GuiClose:
; zuvor GUI ausblenden
If (alpha > Transparent)
Transparent := 255
else
alpha := Transparent
Loop {
DllCall("Sleep", "UInt", 5) ; 5ms Sleep
if (Transparent > 0) {
Transparent--
WinSet, Trans, %transparent%, StreamBAR
} else
break
}
; Volumewert holen
volume := Return DllCall("bass\BASS_GetVolume", "Float")
if volume = 0.00
volume := volume_alt
; ini-Werte schreiben
WinGetPos, xPos, yPos
IniWrite, %sendernumber%, %A_ScriptDir%\config_SB.ini, StreamBAR, sendernumber
IniWrite, %xPos%, %A_ScriptDir%\config_SB.ini, StreamBAR, xPos
IniWrite, %yPos%, %A_ScriptDir%\config_SB.ini, StreamBAR, yPos
IniWrite, %volume%, %A_ScriptDir%\config_SB.ini, StreamBAR, volume
; Audiostream mit fadeWert ausblenden (std = 1000 msec)
DllCall("bass.dll\BASS_ChannelSlideAttribute", UInt,hStream, UInt, 2, Float, 0, UInt, fade)
DllCall("Sleep", "UInt", fade)
DllCall("bass.dll\BASS_SetVolume", "Float", volume) ; Volume-Standardwert setzen
DllCall("bass.dll\BASS_Free") ; BASS.dll zurücksetzen
ExitApp
;=============================================================================================
; Resize-Cursors ausschalten (GUI-Fensterdarstellung: ohne Systembuttons, mit Schatten und aktivem Rahmen
OnSetCursor(WP, LP) {
Static HARROW := DllCall("User32.dll\LoadCursor", "Ptr", 0, "Ptr", 32512, "UPtr") ; Std-Pfeilcursor
HTCODE := LP & 0xFFFF
If (HTCODE > 9) And (HTCODE < 19) { ; cursor über Rahmen?
DllCall("User32.dll\SetCursor", "Ptr", HARROW) ; Pfeilcursor setzen
Return True ; zurück ohne weiteres Verarbeiten
}
}
;=============================================================================================
; Volume per Scrollrad regeln, wenn Maus über GUI ist ...(nur bei kompilierter exe)
#If MouseIsOver("ahk_exe StreamBAR.exe")
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}
#If
MouseIsOver(WinTitle) {
MouseGetPos,,, window
Return WinExist(WinTitle . " ahk_id " . window)
}
;=============================================================================================
; GUI-Fenster aus/einblenden bei Rechtsklick
OnTitlebarClick() {
Gosub TransWindow
Return
}
;=============================================================================================
; ToolTip-RemovalTimer
ToolTipRemove:
SetTimer, ToolTipRemove, Off
ToolTip
Return
;=============================================================================================
; Transparenz ändern -/+ (Rechtsklick TitleBar) ...(nur bei kompilierter exe)
TransWindow:
WinGet, Transparent, Transparent, StreamBAR
if (!Transparent) {
Transparent := 255
Loop {
DllCall("Sleep", "UInt", 5)
if (Transparent > alpha) {
Transparent--
WinSet, Trans, %transparent%, StreamBAR
} else
break
}
} else {
Transparent := Transparent
Loop {
DllCall("Sleep", "UInt", 5)
if (Transparent < 255) {
Transparent++
WinSet, Trans, %Transparent%, StreamBAR
} else {
WinSet, Trans, Off, StreamBAR
break
}
}
}
Return
Die Parameter in der config_SB.ini sind selbsterklärend... denke ich... wenn nicht, fragen.
Freue mich über jede Kritik... solange sie konstruktiver Natur ist.
Die logo-pix sind z.T. selbstgebastelt und dimensionstechnisch angepasst, transparente pngs mit max ~150 x ~70 pixels.
Viel Spaß
moefr01