Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 1: Algoritmische kompositie
Hogeschool Gent : Departement Muziek & Drama
| <Terug naar inhoudstafel kursus> |
1142:
NOTA: dit hoofstukje is eigenlijk verouderd. Voor moderne versies verwijzen we naar onze komponeer-programeertaal GMT waar ondersteuning voor CD spelers gebeurt door rechtstreeks gebruik te maken van de Win API (Windows application interface). Een goed voorbeeld kan je vinden in de source kode voor <Zerhacker> (2001).
CD-besturing vanuit Basic...
Noch Microsoft BC7, noch PowerBasic beschikken over standaard funkties waarmee we de ingebouwde CD speler in onze komputer kunnen besturen. Gelukkig bestaan er externe libraries waarmee dit toch kan worden gerealiseerd.
Het hierbij gegeven voorbeeld programma maakt gebruik van de libraries voor de SoundBlasterkaarten die voorzien zijn van een CD interface.
'***************************************
'* Demonstratieprogramma voor *
'* CD-speler kontrole in Basic *
'* Title : DEMOCD.BAS *
'* Dr.Godfried-Willem Raes *
'***************************************
' 14.04.94: written with the SB develloper kit.
' 24.12.97: tests all the features enhanced in the Creative CDROM drive
' Note: Use switch /Fs for Microsoft Basic PDS 7.1 compiler
' start up as:
' QBX <prog.nam> /L C:\bc7\lib\sbkbc7.qlb
' 24.12.97: tested on UBU. Runs under Win'95.
' Werkt ook met CD spelers die niet op de soundblaster interface
' aangesloten zijn, maar dan komt de audio output niet uit de
' SB kaart audio out, maar wel en uitsluitend uit die van de
' CD-speler zelf.
' $INCLUDE: 'C:\bc7\lib\SBKCD.BI
DECLARE SUB ShowInfo ()
DECLARE SUB Display ()
DECLARE FUNCTION HSG2RED& (wdata AS LONG)
DECLARE FUNCTION BCD2Binary% (wdata AS INTEGER)
DIM skipSec AS INTEGER
DIM wKey AS INTEGER, quit AS INTEGER
DIM drvNum AS INTEGER
skipSec = 16
quit = 0
IF sbcdInit%(drvNum) = 0 THEN '* initialization *'
CALL Display '* display drive operation options *'
WHILE quit = 0
CALL ShowInfo '* show CD info *'
c$ = INKEY$
IF c$ <> "" THEN
c$ = LEFT$(UCASE$(c$), 1)
SELECT CASE c$
CASE "P" '* play first track *'
t% = sbcdPlay%(1, 0, &HFFFF)'* till the end *'
CASE "S" '* stop *'
t% = sbcdStop%
CASE "A" '* pause *'
t% = sbcdPause%
CASE "C" '* continue *'
t% = sbcdContinue%
CASE "N": '* next track *'
t% = sbcdNextTrack%
CASE "L": '* previous track *'
t% = sbcdPrevTrack%
CASE "F": '* fast forward 16 sec *'
t% = sbcdFastForward%(skipSec)
CASE "R": '* rewind 16 sec *'
t% = sbcdRewind%(skipSec)
CASE "E":
t% = sbcdEject% '* open tray *'
CASE "D":
t% = sbcdCloseTray% '* close tray *'
CASE "X":
t% = sbcdLockDoor%(1) '* lock tray *'
CASE "Z":
t% = sbcdLockDoor%(0) '* unlock tray *'
CASE "Q": '* quit *'
quit = 1
PRINT ""
END SELECT
END IF
WEND
ELSE
PRINT "Initialization error."
END IF
END
FUNCTION BCD2Binary% (wdata AS INTEGER)
' convert BCD to binary
DIM retVal AS INTEGER
wdata = wdata AND &HFF
retVal = (wdata \ 16) * 10 + (wdata AND &HF)
BCD2Binary% = retVal
END FUNCTION
SUB Display
' toont de drive kommandos op het scherm
PRINT ""
PRINT "CD Player Demo Program"
PRINT ""
PRINT " P : Play"
PRINT " S : Stop"
PRINT " A : Pause"
PRINT " C : Continue"
PRINT " N : Next Track"
PRINT " L : Previous Track"
PRINT " F : Fast Forward"
PRINT " R : Rewind"
PRINT " E : Eject"
PRINT " D : Close"
PRINT " X : Lock"
PRINT " Z : Unlock"
PRINT " Q : Quit"
PRINT ""
END SUB
FUNCTION HSG2RED& (wdata AS LONG)
'High Sierra format to Red Book format konversie.
DIM v0 AS LONG, v1 AS LONG, v2 AS LONG
v2 = wdata / 4500 '* 4500 = 60 * 75 *'
v1 = (wdata MOD 4500) / 75
v0 = (wdata MOD 4500) MOD 75
HSG2RED& = ((v2 * &H10000) OR (v1 * &H100) OR v0)
END FUNCTION
SUB ShowInfo
DIM qchInfo AS QCHANxINFO
DIM volume AS LONG
DIM t AS INTEGER
t = sbcdGetLocInfo%(qchInfo)
t = sbcdGetVolume%(volume)
volume = HSG2RED&(volume)
PRINT USING "Disc -###:## Track -## ##:## Vol -###:##"; ASC(qchInfo.bPMin); ASC(qchInfo.bPSec); BCD2Binary(INT(ASC(qchInfo.bTNo))); ASC(qchInfo.bMin); ASC(qchInfo.bSec); INT(ABS(volume \ &H10000)) AND &HFF; INT(ABS(volume AND &HFFFF&)) \ _
&H100;
LOCATE , 1
END SUB
Uitgaande van dit kodevoorbeeld wordt het eenvoudig eigen audio CD's met klankmateriaal te gebruiken in real-time algoritmische komposities. Voor heel wat toepassingen is dit een heel wat betere oplossing dan het gebruik van WAV files die je op je harddisk dient op te slaan.
De funktie en procedure deklaratiefile SBKCD.BI ziet eruit als:
'*==========================================================================*'
'* SBKCD.BI (revision 1.0) *'
'* API for SBCD.SYS *'
'*==========================================================================*'
' Typedef for records
'
TYPE DISCxINFO
bLoTNo AS STRING*1 ' Lowest track number
bHiTNo AS STRING*1 ' Highest track number
dwLeadOut AS LONG ' Lead-out address
END TYPE
TYPE QCHANxINFO
bTNo AS STRING*1 ' Current track number in BCD format
bReserved0 AS STRING*1 '
bMin AS STRING*1 ' Minute '
bSec AS STRING*1 ' Second ' running time within a track
bFrame AS STRING*1 ' Frame '
bReserved1 AS STRING*1 '
bPMin AS STRING*1 ' Minute '
bPSec AS STRING*1 ' Second ' running time on the disc
bPFrame AS STRING*1 ' Frame '
END TYPE
'Constants
'
CONST NOTxCDROMxDRIVE = &H22 ' Not a CD-ROM drive
CONST NOTxPLAYxMODE = &H23 ' CD-ROM drive not in play mode
CONST NOTxPAUSExMODE = &H24 ' CD-ROM drive not in pause mode
CONST MAXxTRACKxNO = 100 ' Max. no. of tracks on a disc
'Function prototypes
'
DECLARE FUNCTION sbcdCloseTray% CDECL ()
DECLARE FUNCTION sbcdContinue% CDECL ()
DECLARE FUNCTION sbcdEject% CDECL ()
DECLARE FUNCTION sbcdFastForward% CDECL (BYVAL wSec%)
DECLARE FUNCTION sbcdGetAudioStatus% CDECL (SEG wStatus%)
DECLARE FUNCTION sbcdGetDeviceStatus% CDECL (SEG dwStatus& )
DECLARE FUNCTION sbcdGetDiscInfo% CDECL (SEG lpBuffer AS DISCxINFO)
DECLARE FUNCTION sbcdGetLocInfo% CDECL (SEG lpBuffer AS QCHANxINFO)
DECLARE FUNCTION sbcdGetVolume% CDECL (SEG lpdwVolumeSize&)
DECLARE FUNCTION sbcdInit% CDECL (SEG lpNumDrive%)
DECLARE FUNCTION sbcdLockDoor% CDECL (BYVAL bFunction%)
DECLARE FUNCTION sbcdMediaChanged% (SEG lpChanged%)
DECLARE FUNCTION sbcdNextTrack% CDECL ()
DECLARE FUNCTION sbcdPause% CDECL ()
DECLARE FUNCTION sbcdPlay% CDECL (BYVAL bTrackNo%, BYVAL wOffset%, BYVAL wDuration%)
DECLARE FUNCTION sbcdPrevTrack% CDECL ()
DECLARE FUNCTION sbcdReadToc% CDECL (BYVAL lpTOCBuffer&)
DECLARE FUNCTION sbcdRewind% CDECL (BYVAL wSec%)
DECLARE FUNCTION sbcdSelectDrive% CDECL (BYVAL bDriveNum%)
DECLARE FUNCTION sbcdStop% CDECL ()
'* End of file *'
Uiteraard moet je de nodige gekompileerde libraries op je komputer installeren. Ze heten:
SBKBC7.QLB en SBKBC7.LIB en zijn ter beschikking in de klas, of rechtstreeks van de website van Creative Labs.
Filedate: 98-09-07
| Terug naar inhoudstafel kursus: <Index Kursus> | Naar homepage dr.Godfried-Willem RAES |