Omg äänikortti qb:ssä :o
Noh, ei se ihan aitoa äänistelyä ole se on vain FM-Synthiä mutta sillä saa Hienoja soittimia aikaan!
Aluksi, dimmaa joku variaapeli as soundsystem, sitten settaa sen arvot ja sitten kutsu SetSoundsia ja sitten vaan soitat ääntä PlaySoundilla. Heleppoa kui mikä!
Valmiina esimerkki soundaus tossa jos et tajua.
Koodi ei oikein ole kommentoitu tuolta subeista mutta ne on muuten aika selkeitä paitsi noi bittivääntelyt, juuri ja juuri itse tajuan. Äänikortti valitettavasti haluaa ne ihan inhan tyhmässä muodossa.
Systeemi toimii kaikilla(?) sound blastereilla ja kai pitäisi toimia joillain ADLibin korteilla kun base addressin säätää jonnekki 380h arvoksi. Sen voi varmistaa laitehallinnasta.
IIK korjattu 2.8.2005 (:D): tästä unohtui subi jolla ääni "tyhjennetään" (soundoff). Tolla pitäisi toimia, en voi ite testata ku mun dosboxissa ei toimi äänet :(
TYPE soundsystem
SoundType AS STRING * 1 '"c"=carrier, "m"=modulator
AmplitudeModulation AS INTEGER '0 tai 1
Vibrato AS INTEGER '0 tai 1
OctaveShift AS INTEGER '0 tai 15, 1=normalli
KeyScaling AS INTEGER '0...3
OutPutLevel AS INTEGER '0...63
Attack AS INTEGER '0...15
Decay AS INTEGER '0...15
Sustain AS INTEGER '0...15
Release AS INTEGER '0...15
END TYPE
'Settaa dataa kortille
DECLARE SUB SoundSetReg (Reg%, Value%)
'Settaa äänityyppijutskan jollekki kanavalle, kanavia on 0...8
DECLARE SUB setsounds (Sydeemi AS soundsystem, Canawa%)
'PlaySound soittaa yhden nuotin.
'Octave% on 0llasta 7ttämään, ja Note on C#,D,D#,E,F,F#,G,G#,A,A#,B tai C.
DECLARE SUB playsound (Octave%, Note$, Channel%)
'Sun soundicardis base osoite, vaihda jos se on eri
CONST SoundBaseAddr = &H220
'totta vai tarua
CONST FALSE = 0, TRUE = NOT FALSE
DIM c AS soundsystem, m AS soundsystem
c.SoundType = "c"
c.AmplitudeModulation = 0
c.Vibrato = 1
c.OctaveShift = 1
c.KeyScaling = 0
c.OutPutLevel = 1
c.Attack = 14
c.Decay = 4
c.Sustain = 9
c.Release = 13
m.SoundType = "m"
m.AmplitudeModulation = 0
m.Vibrato = 1
m.OctaveShift = 1
m.KeyScaling = 0
m.OutPutLevel = 1
m.Attack = 14
m.Decay = 4
m.Sustain = 9
m.Release = 13
setsounds c, 0 'settaa carrier
setsounds m, 0 'settaa modulaattori
playsound 1, "F", 0 'soita ääni kanavassa 0
sleep 2 'venataan että se soi
soundoff 0 'kanava 0 pois
DEFINT A-Z
SUB playsound (Octave, Note$, Channel)
SELECT CASE UCASE$(Note$)
CASE "C#"
SoundSetReg &HA0 + Channel, &H6B
SoundSetReg &HB0 + Channel, &H21 + 4 * Octave
CASE "D"
SoundSetReg &HA0 + Channel, &H81
SoundSetReg &HB0 + Channel, &H21 + 4 * Octave
CASE "D#"
SoundSetReg &HA0 + Channel, &H98
SoundSetReg &HB0 + Channel, &H21 + 4 * Octave
CASE "E"
SoundSetReg &HA0 + Channel, &HB0
SoundSetReg &HB0 + Channel, &H21 + 4 * Octave
CASE "F"
SoundSetReg &HA0 + Channel, &HCA
SoundSetReg &HB0 + Channel, &H21 + 4 * Octave
CASE "F#"
SoundSetReg &HA0 + Channel, &HE5
SoundSetReg &HB0 + Channel, &H21 + 4 * Octave
CASE "G"
SoundSetReg &HA0 + Channel, &H2
SoundSetReg &HB0 + Channel, &H22 + 4 * Octave
CASE "G#"
SoundSetReg &HA0 + Channel, &H20
SoundSetReg &HB0 + Channel, &H22 + 4 * Octave
CASE "A"
SoundSetReg &HA0 + Channel, &H41
SoundSetReg &HB0 + Channel, &H22 + 4 * Octave
CASE "A#"
SoundSetReg &HA0 + Channel, &H63
SoundSetReg &HB0 + Channel, &H22 + 4 * Octave
CASE "B"
SoundSetReg &HA0 + Channel, &H87
SoundSetReg &HB0 + Channel, &H22 + 4 * Octave
CASE "C"
SoundSetReg &HA0 + Channel, &HAE
SoundSetReg &HB0 + Channel, &H22 + 4 * Octave
END SELECT
END SUB
SUB soundoff(Channel)
SoundSetReg &HB0 + Channel, 0
END SUB
SUB setsounds (Sydeemi AS soundsystem, Canawa)
SELECT CASE Canawa
CASE 0: ccarrier = &H0: cmodulator = &H3
CASE 1: ccarrier = &H1: cmodulator = &H4
CASE 2: ccarrier = &H2: cmodulator = &H5
CASE 3: ccarrier = &H8: cmodulator = &HB
CASE 4: ccarrier = &H9: cmodulator = &HC
CASE 5: ccarrier = &HA: cmodulator = &HD
CASE 6: ccarrier = &H10: cmodulator = &H13
CASE 7: ccarrier = &H11: cmodulator = &H14
CASE 8: ccarrier = &H12: cmodulator = &H15
END SELECT
IF LCASE$(Sydeemi.SoundType) = "c" THEN
settaus = ccarrier
ELSEIF LCASE$(Sydeemi.SoundType) = "m" THEN
settaus = cmodulator
ELSE
EXIT SUB
END IF
d = 0
IF Sydeemi.AmplitudeModulation THEN d = d + 128
IF Sydeemi.Vibrato THEN d = d + 64
IF (Sydeemi.OctaveShift >= 0) AND (Sydeemi.OctaveShift <= 15) THEN
d = d OR Sydeemi.OctaveShift
END IF
SoundSetReg &H20 + settaus, d
'PRINT HEX$(&H20 + settaus); "->"; HEX$(d); " OK"
d = 0
IF (Sydeemi.KeyScaling >= 0) AND (Sydeemi.KeyScaling <= 3) THEN
d = d OR (Sydeemi.KeyScaling * 64)
END IF
IF (Sydeemi.OutPutLevel >= 0) AND (Sydeemi.OutPutLevel <= 63) THEN
d = d OR Sydeemi.OutPutLevel
END IF
SoundSetReg &H40 + settaus, d
'PRINT HEX$(&H40 + settaus); "->"; HEX$(d); " OK"
d = 0
IF (Sydeemi.Attack >= 0) AND (Sydeemi.Attack <= 15) THEN
d = d OR (Sydeemi.Attack * 16)
END IF
IF (Sydeemi.Decay >= 0) AND (Sydeemi.Decay <= 15) THEN
d = d OR Sydeemi.Decay
END IF
SoundSetReg &H60 + settaus, d
'PRINT HEX$(&H60 + settaus); "->"; HEX$(d); " OK"
d = 0
IF (Sydeemi.Sustain >= 0) AND (Sydeemi.Sustain <= 15) THEN
d = d OR (Sydeemi.Sustain * 16)
END IF
IF (Sydeemi.Release >= 0) AND (Sydeemi.Release <= 15) THEN
d = d OR Sydeemi.Release
END IF
SoundSetReg &H80 + settaus, d
'PRINT HEX$(&H80 + settaus); "->"; HEX$(d); " OK"
END SUB
SUB SoundSetReg (Reg, Value)
OUT SoundBaseAddr + 8, Reg
OUT SoundBaseAddr + 9, Value
END SUBlainaus:
Noh, ei se ihan aitoa äänistelyä ole se on vain FM-Synthiä mutta sillä saa Hienoja soittimia aikaan!
Teeppäs sitten semmonen jolla saa aitoa äänistelyä :>
vaikeeta... mut kyllähän toi toimii ihan mukavasti niin pidä kivaa ton kanssa ensiks vähän aikaa.
"dimmaa, sitten settaa, soundaus"
örph?
Ei kuulu. Ainakaa mitään. tai sit mä en osaa jotain hommaa...
Mun piti joskus kans tehä FM-synteesin käytöstä esimerkki, mutta taisin unohtaa ja jäi tekemättä :P
eiks, rndprogy? sitten sulla on ihan väärä äänikortti tai sitten toi base addressi pitää muuttaa. Mikäs äänikortti sulla? täähän ei tue kun blasteria ja adlibiä...
Aito äänistely vaikeeta? eipä oo! mä oon tehny sitä QBllä, eikä se vaikeeta ole.. En nyt muista miten se tehdään :|
Windows NT/2000/XP:llä äänikorttia ei voi suoraan käyttää DOSista, mutta VDMSound-niminen ohjelma auttaa tähän ongelmaan: http://ntvdm.cjb.net/
no NT/2k/XP:ssä ei DOSista voi tehä mittää ainaskaa qb:llä se ei toimi yhtää dossissa
ehh, korjaus, siis dossi ei toimi yhtää ntssä...
Soi vain kerran kunnes vaihtaa kanavanumeroa.
Hmm. Aattelinpa ite nyt ihan kokeillakin fm-synteesiä qb:ssä, tuli käyttöä.
Vähän huono muutes tosiaan, kuten akx sanoi, soi vain kerran. Miksi? Onks siihen mitään korjausta?
Ainiin, ja eikös tuon portin saa BLASTER-ympäristömuuttujasta? Siinä on jotain esim. A220 I7 D1 T4 joista muiden käyttötarkotusta en muista (oisko I7 et se käyttää IRQ:ta 7 ja D1 joku DMA:han liittyvä?) mut tuo A220 on varmaanki se portti, eli 220 :o
Edit: JEE IHCUSOODA KORJAS <3
Jostakin kun säätää, niin midit kuuluu fmsynteesillä. Niin miksei tällä voisi soittaa midejä?
edit: en ole kyllä tutustunut tähän oikein, niin en teidä.
Antti Laaksonen kirjoitti:
Windows NT/2000/XP:llä äänikorttia ei voi suoraan käyttää DOSista
Eivätkö nuo kaikki kuulu NT-perheeseen? Tietenkään DOS ei kuulu :)
Todellllllllllla mahtava ohjelma... pah.
Minulla Sleeppaa muutaman sekuntin, mutta pihaustakaan ei kuulu... (äänet on täysillä)
Hyvä ohjelma, opin itsekin käyttämään blasteria. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.