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 |