Note

This version was made before v0.6 and should be refactor using the AGEBasic cabinet event system.

CDL

---
name: stupid_jukebox_screen
material: black
 
author: Curif
version: 1.0
comment: Insert coin to shuffle play. (c) https://archive.org/details/synthwave-dreams-vol.-1-16
debug-mode: true
 
model:
  file: jukebox_screen.glb
 
agebasic:
  active: true
  debug: true
  after-insert-coin: stupid_jukebox_screen_insert_coin.bas
 
coinslot: coin-slot-small
coinslotgeometry:
  rotation:
    x: -90
    
crt:
  type: 19i-agebasic
  orientation: horizontal
  screen:
    shader: crt
    damage: medium
    invertx: false
    inverty: false
  geometry:
    rotation: 
      x: -90
 

file:“stupid_jukebox_screen_insert_coin.bas”

10 REM Initialize and read music directory content
 
20 LET musicDirectory = MusicPath()
30 LET fileList = getFiles(musicDirectory, ":", 0)
40 LET fileTotal = CountMembers(fileList, ":")
50 LET filesPerPage = 10
60 LET currentPage = 0
70 LET totalPages = fileTotal / filesPerPage
80 IF MOD(fileTotal, filesPerPage) > 0 THEN LET totalPages = INT(totalPages + 1)
85 LETS width, height = screenWidth(), ScreenHeight()
90 LET emptyline = " " * (width - 1)
100 LETS currentIndex, windowChanged, rowStart = 0, 0, 5
110 LET SelectedList = ""
120 LET option = -1
125 LETS volume, minDB, maxDB = AudioMusicGetVolume(), -80, 0
 
130 CLS
140 PRINT 0,0, ("\64" * 15) + " JUKEBOX " + ("\64" * 15), 1, 0
150 PRINT 0,2, "B=SELECT Y=OPTIONS A=EXIT", 0,0
160 PRINT 0,3, "up/down/left/right to move",0,0
170 PRINT 0,4, "-" * (width  - 1), 0,0 
180 PRINT 0,rowStart + filesPerPage, "-" * (width  - 1), 0,0 
 
190 GOSUB 4500 'print menu
195 GOSUB 7530 'volume indicator
200 GOSUB 1000 'print window
 
230 REM Input loop for navigation and selection
250 IF ControlActive("JOYPAD_RIGHT") THEN GOSUB 700
    ELSE IF ControlActive("JOYPAD_LEFT")  THEN GOSUB 600 
    ELSE IF ControlActive("JOYPAD_DOWN")  THEN GOSUB 800
    ELSE IF ControlActive("JOYPAD_UP")  THEN GOSUB 900
    ELSE IF ControlActive("JOYPAD_B") THEN GOSUB 1600  ' select/unselect option
    ELSE IF ControlActive("JOYPAD_Y") THEN GOSUB 5000 ' main menu
    ELSE IF ControlActive("JOYPAD_A") THEN END  ' exit jukebox
    
320 REM Refresh display if page or selection changes
330 IF windowChanged THEN GOTO 200
350 SLEEP 0.1
360 GOTO 250  ' Repeat input loop
 
600 ' handling page left
610 IF currentPage <= 0 THEN RETURN
620 LET currentPage = currentPage - 1
630 LETS currentIndex, windowChanged = currentPage * filesPerPage, 1
640 RETURN
 
700 ' handling page right
710 IF currentPage >= totalPages - 1 THEN RETURN
720 LET currentPage = currentPage + 1
730 LETS currentIndex, windowChanged = currentPage * filesPerPage, 1
740 RETURN 
 
800 ' handling line down
810 IF currentIndex >= endIndex THEN RETURN
820 LETS currentIndex, windowChanged = currentIndex + 1, 1
830 RETURN
 
900 'handling line up
910 if currentIndex <= startIndex THEN RETURN
920 LETS currentIndex, windowChanged = currentIndex - 1, 1
930 RETURN
 
1000 REM Display file window
1020 LET startIndex = currentPage * filesPerPage
1030 LET endIndex = MIN(startIndex + filesPerPage - 1, fileTotal - 1)
1050 LETS row, maxrow = rowStart, rowStart + filesPerPage
 
1060 REM Display loop for file names
1070 FOR i = startIndex TO endIndex
1080     LET fileName = GetMember(fileList, i, ":")
1085     PRINT 0, row, IIF(MusicExist(fileName), "\117", " "), 0, 0
1090     PRINT 1, row, SUBSTR(fileName + emptyline, 0, 35), (i = currentIndex), 0
1100     LET row = row + 1
1110 NEXT i
1120 LET windowChanged = 0
1130 IF row < maxrow THEN GOSUB 1500
1135 GOSUB 2000 ' show window position
1140 SHOW
1150 RETURN
 
1500 ' fill window available space
1510 for fill = row to maxrow
1520   print 0, fill, emptyline, 0, 0
1530 next fill
1540 RETURN
 
1600 ' Subroutine to select/unselect a music file (add/remove from jukebox queue)
1610 LET LastSelected = GetMember(fileList, currentIndex, ":")
1620 if MusicExist(LastSelected) THEN CALL MusicRemove(LastSelected) ELSE CALL MusicAdd(LastSelected)
1640 LET windowChanged = 1
1650 RETURN
 
2000 'show window position
2005 LET screenRowDebug = height - 1
2020 print 0,screenRowDebug, "page:" + str(currentPage)+ "  ", 0, 0
2030 print 10,screenRowDebug, "totp:" + str(totalPages)+ "  ", 0, 0
2040 print 20,screenRowDebug, "totf:" + str(fileTotal)+ "  ", 0, 0
2050 REM print 30,screenRowDebug, "sel:" + str(CountMembers(SelectedList, ":"))+ "  ", 0, 0
2060 RETURN
 
4500 ' draw menu
4510 PRINT 0, 16, "options:", 0, 0
4520 PRINT 2, 17, "clear selections", option = 0, 0
4530 PRINT 2, 18, "select all in folder", option = 1, 0
4540 PRINT 2, 19, "go to first page", option = 2, 0
4550 PRINT 2, 20, "go to last page", option = 3, 0
4560 PRINT 2, 21, "EXIT JUKEBOX", option = 4, 0
 
4570 PRINT 24, 17, IIF(MusicLoopStatus(), "LOOP (OFF)     ", "LOOP (ON)    "), option = 5, 0
4580 PRINT 24, 18, "RESET", option = 6, 0
 
4590 GOSUB 7500 'Draw volume
4600 LET redrawoptions = 0
4610 SHOW
4620 RETURN
 
5000 ' start menu -------------------
5010 LETS option, redrawoptions = 0, 0
5020 GOSUB 4500
5030 SLEEP 0.3 'to avoid repeat a button
 
5040 IF ControlActive("JOYPAD_DOWN") THEN LETS option, redrawoptions = MOD(option + 1, 7), 1 
     ELSE IF ControlActive("JOYPAD_UP") THEN LETS option, redrawoptions = MOD(option - 1 + 7, 7), 1
     ELSE IF ControlActive("JOYPAD_B") THEN GOSUB 5500 ' process selected menu option
     ELSE IF ControlActive("JOYPAD_Y") THEN GOTO 5100 'exit menu
     ELSE IF ControlActive("JOYPAD_RIGHT") THEN GOSUB 8000 ' vol up
     ELSE IF ControlActive("JOYPAD_LEFT")  THEN GOSUB 8500 ' vol down
5050 IF redrawoptions THEN GOSUB 4520 
5055 SLEEP 0.1
5060 GOTO 5040
 
5100 'exit menu
5110 LET option = -1
5120 GOSUB 4520
5130 RETURN
 
5500 IF option = 0 THEN GOSUB 6300
     ELSE IF option = 1 THEN GOSUB 6200
     ELSE IF option = 2 THEN GOSUB 6000
     ELSE IF option = 3 THEN GOSUB 6100
     ELSE IF option = 4 THEN END
     ELSE IF option = 5 THEN GOSUB 6500
     ELSE IF option = 6 THEN GOSUB 7000
5510 RETURN
 
6000 ' goto first page
6020 LET currentPage = 0
6030 LET currentIndex = 0
6040 GOSUB 1000 'redraw window file
6050 RETURN
 
6100 ' go to last page
6110 LET currentPage = totalPages - 1
6120 LET currentIndex = currentPage * filesPerPage
6120 GOSUB 1000 'redraw
6130 RETURN
 
6200 'add all files
6210 CALL MusicAddList(fileList, ":")
6220 LET currentPage = 0
6230 LET currentIndex = 0
6240 GOSUB 1000 'redraw file window
6250 RETURN
 
6300 'clear all files
6310 CALL MusicClear()
6320 LET currentPage = 0
6330 LET currentIndex = 0
6340 GOSUB 1000 'redraw
6350 RETURN
 
6500 'loop
6510 CALL MusicLoop(NOT(MusicLoopStatus()))
6520 LET redrawoptions = 1
6530 RETURN
 
7000 'loop
7010 CALL MusicReset()
7020 RETURN
 
7500 REM Draw Volume Indicator (volume is in dB) ---------------------------------------
7510 if volume = AudioMusicGetVolume() THEN RETURN ELSE LET volume = AudioMusicGetVolume()
7520 IF volume < minDB THEN LET volume = minDB
     ELSE IF volume > maxDB THEN LET volume = maxDB
7530 LET volumePercent = INT((volume - minDB) / (maxDB - minDB) * 100)
7540 LET volumeRatio = INT((volumePercent / 100) * (width - 5))
7550 LET indicator = "\126" * volumeRatio
7560 PRINT 0, height - 2, "vol " + indicator + " ", 0, 0
7570 RETURN
 
8000 ' volume up
8010 IF volume >= maxDB THEN RETURN
8020 LET volume = volume + 1
8030 CALL AudioMusicSetVolume(volume)
8040 GOSUB 7530
8050 SHOW
8060 RETURN
 
8500 ' volume down
8510 IF volume <= minDB THEN RETURN
8520 LET volume = volume - 1
8530 CALL AudioMusicSetVolume(volume)
8540 GOSUB 7530
8550 SHOW
8560 RETURN