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