[Nim] und die BASS-Dll

    • Offizieller Beitrag

    Um mit Nim die BASS-Dll nutzen zu können, ist der Wrapper "Nimbass" von "genotrance" erforderlich (https://github.com/genotrance/nimbass).

    Dort gibt es auch eine Anleitung zum installieren per Nimble.


    Im Prinzip benötigt man aber nur die "bass.dll" und "bass.nim". Im ZIP-Archiv (Anhang) habe ich diese beiden Dateien in den Ordner "nimbass" kopiert.

    Das Nim-Programm zum abspielen einer MP3-Datei sieht dann so aus:

    BASS_StreamCreateFile erwartet einen Pointer auf den Dateinamen, weshalb man den String erst in einen C-String (Char-Array) umwandeln muss.


    Da ich mich mit Nim erst seit ein paar Tagen beschäftige, war da ziemlich viel "trial and error" nötig, aber so funktioniert es zumindest. :)


    Edit: Hier noch eine überarbeitete Version. Die benutzt noch ein paar mehr Funktionen der BASS-dll und ist kommentiert:

  • Schön!


    Habe es noch etwas erweitert... jetzt kann die Exe mit Parameter aufrufen werden... und es muss kein *.mp3 sein... *.m4a und *.flac usw. geht auch. ;)

    Bsp.: Test.exe "F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"

    • Offizieller Beitrag

    So funktioniert es nicht!
    let sMp3File = "F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"

    Wenn Du in Nim einen String mit Backslashes hast, dann einfach ein "r" (RawString) davorsetzen:

    let sMp3File = r"F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"

  • Oscar

    Hat den Titel des Themas von „Nim und die BASS-Dll“ zu „[Nim] und die BASS-Dll“ geändert.
  • Gun-Food

    Hat das Label Nim hinzugefügt.
  • echo "Position: " & $int(iSecondsNow) & " / " & $int(iSeconds)

    sleep(1000)

    Wenn die Ausgabe immer in derselben Zeile bleiben soll:

    Code
    # "\r" puts the write cursor back at the beginning of the line
    
    #[
    stdout.write "\rPlay: " & $int(iSecondsNow) & " / " & $int(iSeconds)                     # Play: 118 / 204
    ]#
    
    stdout.write "\rPlay: " & fmt"{$int(iSecondsNow):>4}" & " / " & fmt"{$int(iSeconds):>4}" # Play:  118 /  204
    sleep(1000)
  • Moin,


    gestern hatte ich festgestellt, das BASS_StreamCreateFile mir einen Fehler beschert, wenn der Dateipfad UTF-8-Zeichen enthält: BASS_ERROR_FILEOPEN (2) = Datei nicht gefunden.


    Nach etlichen Stunden und ungezählten Versuchen, den String zu konvertieren, hatte ich dann entdeckt, dass ich bei BASS_StreamCreateFile ein BASS_UNICODE flag setzen kann... und dann fing der Ärger erst richtig an!


    http://www.un4seen.com/doc/#bass/BASS_StreamCreateFile.html

    BASS_UNICODE file is in UTF-16 form. Otherwise it is ANSI on Windows or Windows CE, and UTF-8 on other platforms.


    Was soll denn der Quatsch? Wieso UTF-8 nur für andere Plattformen und wieso trotz des Flags nur ANSI für Windows?


    Ich bekomme es einfach nicht hin, dass BASS_StreamCreateFile Dateien abspielt, die UTF-8-Zeichen im Dateipfad haben. Als Möglichkeit sehe ich hier, die Datei temporär umzubenennen... oder einen Hardlink zu erzeugen, der keine UTF-8-Zeichen enthält. Damit dies nicht für alle Dateipfade gemacht werden muss, müsste ich prüfen, ob UTF-8-Zeichen enthalten sind... das wäre das nächste Problem.


    Bei diesem Namen ist es mir aufgefallen: Louisa Johnson - Who’s Loving You.m4a


    Wer kann helfen?

    • Offizieller Beitrag

    Als Möglichkeit sehe ich hier, die Datei temporär umzubenennen

    Ich würde eher dazu tendieren, Nicht-ANSI Zeichen in Dateinamen generell durch ANSI zu ersetzen.

    Also statt

    Louisa Johnson - Whos Loving You.m4a

    besser

    Louisa Johnson - Who's Loving You.m4a


    Ist vielleicht Geschmackssache, aber ich halte absolut nichts von Nicht-ANSI Zeichen (und Leerzeichen!) in Pfad-/Dateinamen. In meiner Musikbibliothek würde dein Bsp. so aussehen:

    Louisa_Johnson__Who's_Loving_You.m4a

    In den Tags kann drinstehen was will, das wird ja auch entsprechend für die Anzeige genutzt, also kann doch der Dateiname "sauber" bleiben. ;)

  • OT: Uiuiuiuiuiui, da wäre ich ganz vorsichtig. Bei einigen Leuten grenzt das Thema schon an religiösem Fanatismus :D

    • Offizieller Beitrag

    OT: Uiuiuiuiuiui, da wäre ich ganz vorsichtig. Bei einigen Leuten grenzt das Thema schon an religiösem Fanatismus

    Naja, selbst schuld, würde ich sagen.

    Alle nicht ANSI-Zeichen machen immer wieder auf irgendwelchen Geräten Probleme. Zumindest meiner Erfahrung nach. Smartphone, MP3-Player, Autoradio, Fernseher, ganz egal, irgendwo hakt es immer.

    Ich habe meine MP3-Sammlung jedenfalls ANSI-konform erstellt und seitdem keinerlei Probleme. Wobei ich durchaus auch Leerzeichen im Dateinamen verwende.

  • Naja, selbst schuld, würde ich sagen.

    Alle nicht ANSI-Zeichen machen immer wieder auf irgendwelchen Geräten Probleme. Zumindest meiner Erfahrung nach. Smartphone, MP3-Player, Autoradio, Fernseher, ganz egal, irgendwo hakt es immer.

    Ich habe meine MP3-Sammlung jedenfalls ANSI-konform erstellt und seitdem keinerlei Probleme. Wobei ich durchaus auch Leerzeichen im Dateinamen verwende.

    Das ist schon etwas dreist wenn du mal etwas weiter Richtung Osten guckst. Du kommst um Unicode/UTF-8 (und Konsorten) nicht rum wenn du etwas exotischeres hast.

    Und die Dateinamen dann zu übersetzen ist kompletter Humbug, da die Dateien selbst anders sortiert werden als mit ihrem originalen Unicode-Titel.


    Um ehrlich zu sein hatte ich bisher mit solchen Titeln nie Probleme, bis auf Musik die auf CD gebrannt wurde und dann im Auto zum Einsatz kam.

    Aber das sollte auch nicht überraschen, weil das Auto BJ 2007 ist. Jeder moderne Player sollte damit absolut kein Problem haben.

    • Offizieller Beitrag

    Und die Dateinamen dann zu übersetzen ist kompletter Humbug, da die Dateien selbst anders sortiert werden als mit ihrem originalen Unicode-Titel.

    :rofl: Du bist lustig - schon mal was von Ziffern gehört? Da auch ANSI konforme Daten nicht in alphabetischer Reihenfolge auf der CD/DVD gespeichert sind, wird doch sowieso nummeriert. :P

  • :rofl: Du bist lustig - schon mal was von Ziffern gehört? Da auch ANSI konforme Daten nicht in alphabetischer Reihenfolge auf der CD/DVD gespeichert sind, wird doch sowieso nummeriert. :P

    Tja, Ziffern bringen dir da auch nichts wenn der Player die Liste nicht darstellen kann.

    Je nach Zeichen und Brennvorgang habe ich mal als Titel und Interptetnamen nur ?-Zeichen, und mal komplettes Gewurstel.


    Wenn ich durch die Tracks scrollen möchte wird ab und zu (je nach CD) nach einigen Tracks der Name nicht mehr eingeblendet, aber man kann noch munter weiterscrollen.

    Die Lieder sind zwar in der korrekten Reihenfolge, doch bringt dir das nichts wenn du keinen Index hast, von dem du das auswählen könntest.


    Schade, dass ich grad keine Fotos parat habe sonst hätte ich dir das gerne gezeigt.


    Außerdem ging es mir bei dem Post nicht direkt um das Brennen auf CDs mit Indizes, sondern wenn man alles in einem Ordner hat (Daily Playlist oder ähnlich).

    Dort sind sie dann falsch sortiert.

  • Ich würde eher dazu tendieren, Nicht-ANSI Zeichen in Dateinamen generell durch ANSI zu ersetzen.

    Ja, mit meinen Dateien mache ich das auch... bei Audio-Dateien mit Mp3tag.


    Ungeachtet dessen hätte ich trotzdem gerne die Möglichkeit, solche Dateien mit BASS abspielen zu können, zumal dies auch jeder mir bekannte Player kann.


    Wenn ich z.B. ein Script mit BASS für andere Leute schreibe, die mir Geld dafür geben, steht nicht BASS blöd da, sondern ich, wenn ich denen sage: Du musst deine Dateien umbenennen, weil mein Script nicht mit UTF-8-Zeichen im Dateipfad funktioniert.

    • Offizieller Beitrag

    Ich bekomme es einfach nicht hin, dass BASS_StreamCreateFile Dateien abspielt, die UTF-8-Zeichen im Dateipfad haben.


    Bei diesem Namen ist es mir aufgefallen: Louisa Johnson - Who’s Loving You.m4a

    Ich habe jetzt noch diverse Versuche unternommen. So funktioniert es jetzt bei mir:

  • Hier noch eine etwas erweiterte Version von @Oscar's BassTest.nim, die nun (dank Oscar) auch mit UTF-8-Zeichen im Pfad klar kommt... und die mich viele graue Haare gekostet hat!


    Wird kein Parameter (Verzeichnis oder Datei) angegeben, öffnet sich ein FileDialog, mit dem eine oder mehrere Dateien geladen werden können. Erfolgt im FileDialog keine Auswahl, wird das Programm beendet.

    Alternativ kann aber auch eine Datei angegeben werden, die eine M3U-Playlist oder eine Liste von Verzeichnissen und /oder Dateien enhält. Dazu muss vor dem Dateiname ein -l: (kleines L) stehen.

    Zudem kann mit -v:n.n die Lautstärke gesetzt werden. Erlaubte Werte: 0.0 - 1.0. Default ist -v:0.5


    Bsp.:

    BassTest.exe

    BassTest.exe -v:0.3

    BassTest.exe "f:\Audio\MP3\International\S\Supertramp\1992 - The Very Best Of Supertramp Vol.02" ; Verzeichnis (ohne abschließenden Backslash)

    BassTest.exe "f:\Audio\MP3\International\S\Supertramp\1992 - The Very Best Of Supertramp Vol.02\01. Supertramp - Lady.mp3" ; Datei

    BassTest.exe -l:"f:\Audio\MP3\International\S\Supertramp\1992 - The Very Best Of Supertramp Vol.02\1992 - The Very Best Of Supertramp Vol.02.m3u" ; M3U-Playlist

    BassTest.exe "-l:m:\playlist.lst" ; Listfile, z.B. mit Total Commander (%UL)

    BassTest.exe -v:0.7 -l:"m:\playlist.lst" ; Listfile, z.B. mit Total Commander (%UL)


    Erfolgreich getestet habe ich folgende Formate: ".mp3", ".m4a", ".flac", ".wav", ".wma", ".aif", ".ac3", ".mp2". Mit entsprechenden Add-ons geht aber noch viel mehr.