Schneider / Amstrad CPC Forum

Amstrad / Schneider CPC => Hardware => Topic started by: LambdaMikel on 11. February 2021, 07:42:50

Title: LambdaSpeak FS - MP3 Player
Post by: LambdaMikel on 11. February 2021, 07:42:50
Hi TFM, ich habe mich mal an die Query Commands vom MP3-Player rangesetzt. Bitte einmal das Programm MP3NEW.BAS auf der angehängten DSK anschauen. Da habe ich demohalber mal 2 Queries implementiert: Current Volume und Current File. Dabei handelt es sich also um die Queries "0x4c = &4c" (Query Playing N) und "0x43 = &43" (Query Volume).


#define CMD_PLAYING_N         0x4C // qPlaying();  // Ask for the file is playing
#define CMD_QUERY_STATUS      0x42 // qStatus();   // Ask for the status
#define CMD_QUERY_VOLUME      0x43 // qVol();      // Ask for the volumen. // Sometime board fails
#define CMD_QUERY_FLDR_TRACKS 0x4E // qFTracks();  // Ask for the number of tracks folders
#define CMD_QUERY_TOT_TRACKS  0x48 // qTTracks();  // Ask for the total of tracks
#define CMD_QUERY_FLDR_COUNT  0x4F // qTFolders(); // Ask for the number of folders


Nach einer gewissen Wartezeit nach Absenden der Query (ich weiß nicht, wie lang die sein muss! s. Wartezählschleife im Basic-Programm) finden sich dann 10 Bytes im Buffer, die immer folgende Struktur haben:


7E FF 06 <QUERY> 0 0 <DAT> FE 9A EF


Meist kommt es nur auf <DAT> an. Am Besten kannst Du das mit dem "Query Volume" sehen. Dort wird dann <QUERY> = &43 sein, und <DAT> die momentan eingestellte Lautstärke.  Frag mich jetzt nicht wie die Files gezählt werden... das schein entweder rückwärts oder vorwärts zu gehen  :00008351:

Statt Wartezählschleife bis die Anwort auf die Query im Serial Buffer ist, kannst natürlich auch loopen und den Status abfragen wieviele Bytes für Dich zum Abholen bereit sind. Sollte klar werden wie das Serial Interface zum LSFS tickt anhand des Codes. Habe sogar ein paar Kommentare reingeschrieben  :zwinker0018:

Viel Spaß damit
Michael

Und hier im Source:

10 MODE 2
20 WINDOW #2,1,80,18,25
30 PRINT "LambdaSpeak MP3 Serial Jukebox"
40 PRINT "(C) 2019 by LambdaMikel"
50 PRINT
60 PRINT "Use 1..9 for song selection"
70 PRINT "Use <z>,<x> for volume, <m> for max volume"
80 PRINT "Use <space> for pause & play"
90 PRINT "Use <q> for song playing query"
100 PRINT "Use <v> for current volume query"
110 p=0
120 OUT &FBEE,&F1
130 FOR i=1 TO 200:NEXT
140 a=&C:b=0:c=0:GOSUB 280
150 a$=INKEY$:IF a$="" THEN 150
160 LOCATE 1,10:PRINT "                             ":LOCATE 1,10
170 IF a$="z" THEN PRINT "Increase Volume":a=4:b=0:c=0:GOSUB 280:GOTO 150
180 IF a$="x" THEN PRINT "Decrease Volume":a=5:b=0:c=0:GOSUB 280:GOTO 150 
190 IF a$="m" THEN PRINT "Max Volume":a=6:b=0:c=30:GOSUB 280:GOTO 150
200 IF a$="q" THEN PRINT "Query Song":a=&4C:b=0:c=0:GOSUB 280:FOR l=1 TO 1500:NEXT:GOSUB 420:GOTO 150
210 IF a$="v" THEN PRINT "Query Volume":a=&43:b=0:c=0:GOSUB 280:FOR l=1 TO 1500:NEXT:GOSUB 420:GOTO 150   
220 IF a$=" " AND p=0 THEN PRINT "Pause":a=&E:b=0:c=0:GOSUB 280:p=1:GOTO 150
230 IF a$=" " AND p=1 THEN PRINT "Continue":a=&D:b=0:c=0:GOSUB 280:p=0:GOTO 150
240 a=&F:b=1:c=ASC(a$)-48
250 PRINT "Play 01/00";a$;".mp3"
260 GOSUB 280
270 GOTO 150
280 REM
290 OUT &FBEE,&7E
300 OUT &FBEE,&FF
310 OUT &FBEE,&FF   
320 OUT &FBEE,&6
330 OUT &FBEE,a
340 OUT &FBEE,0
350 OUT &FBEE,b
360 OUT &FBEE,c
370 OUT &FBEE,&EF
380 REM send command
390 OUT &FBEE,255
400 OUT &FBEE,2
410 RETURN
420 REM ask for low number of bytes. protocol: <byte>, 0, 16 = ready again
430 CLS #2
440 OUT &FBEE,255
450 OUT &FBEE,3
460 lo=INP(&FBEE)
470 IF INP(&FBEE)=0 THEN 470
480 IF INP(&FBEE)<>16 THEN 480
490 REM ask for high number of bytes. protocol: <byte>, 0, 16 = ready again
500 OUT &FBEE,255   
510 OUT &FBEE,4
520 hi=INP(&FBEE)
530 IF INP(&FBEE)=0 THEN 530
540 IF INP(&FBEE)<>16 THEN 540       
550 REM retrieve bytes from receive buffer
560 a=lo+hi*256
570 PRINT #2,"Bytes in buffer: ";a   
580 PRINT #2
590 IF a=0 THEN RETURN
600 PRINT #2,"Content:"   
610 PRINT #2
620 REM set read cursor to 0 
630 OUT &FBEE,255 
640 OUT &FBEE,12
650 REM wait for ready
660 WAIT &FBEE,16
670 FOR i=1 TO a
680 REM wait for ready
690 WAIT &FBEE,16
700 REM retrieve next byte from buffer. protocol <byte>, 0, 16
710 OUT &FBEE,255
720 OUT &FBEE,9
730 x=INP(&FBEE)
740 IF INP(&FBEE)=0 THEN 740
750 IF INP(&FBEE)<>16 THEN 750   
760 IF x=13 THEN PRINT:GOTO 800
770 IF i=7 THEN PRINT #2,">>> ";
780 PRINT #2,HEX$(x);" ";     
790 IF i=7 THEN PRINT #2,"<<< "; 
800 NEXT
810 PRINT #2
820 RETURN


Title: Re: LambdaSpeak FS - MP3 Player
Post by: TFM on 11. February 2021, 19:14:34
Vielen Dank, damit kann ich etwas anfangen :)

Habe für den MP3 Teil mal den Thread getrennt, denn...

Hier noch eine wichtige Information:
Die MP3 Songs müssen nicht nur nummeriert sein, sondern auch entsprechend ihrer Nummern auf die SD Karte kopiert werden! Wenn nicht verwechselt der MP3 Player die Lieder.
Title: Re: LambdaSpeak FS - MP3 Player
Post by: TFM on 07. March 2021, 20:12:14
Hier ist ein Mega-Download mit all den Liedern für den LambdaSpeak III und FS.
Kopiert man diesen Ordner auf die SD-Karte des MP3 Players, so kann man von der LS Disk die MP3's abspielen und die Zeit- und Titel-Informationen stimmen.

Das ganze hat so etwas 1 GB.

User, die den LFS in letzter Zeit bekommen haben finden diese Musik-Dateien bereits auf ihrer Gratis-SD-Karte.  :)

Hier der Link:
https://mega.nz/file/q0djxIYD#dYcjvVoW3frF6eo_L1dZwh76BI6laYOwBrThm46u56k
Title: Re: LambdaSpeak FS - MP3 Player
Post by: LambdaMikel on 08. March 2021, 08:25:09
  :jubelaola: Du hast einen super Musikgeschmack! Vielen Dank dafür!
Title: Re: LambdaSpeak FS - MP3 Player
Post by: TFM on 08. March 2021, 16:14:31
Danke. Weitere Musik füge ich gerne hinzu und pflege sie dann auch in den 'MP3-Play'er ein.  :)
Bis 32 GB ist ja Platz genug.  :smiley027:
Title: Re: LambdaSpeak FS - MP3 Player
Post by: TFM on 29. March 2021, 13:01:15
Michael hat mich darauf hingewiesen, dass es mit dem MP3 Player 'MP3-PLAY.BAS' auf dem CPC464 Probleme gibt.
Nun, das liegt daran, daß der 464er das FRAME Kommando in BASIC 1.0 nicht kennt. Wenn man jedes FRAME durch einen CALL &BD19 ersetzt, dann sollte es funktionieren. Mal sehen, ob das reicht...

EDIT: Daneben müsste man noch das "ON BREAK GOSUB" in Zeile 18 entfernen.
Und man müsste die REMarks in den DATA Zeilen entfernen.

Also: Besser den Player vom Michael auf dem CPC464 nutzen.  :)