 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.08.2007, 14:33 Titel: Sound unter DOS |
|
|
Hehe, wiedermal verrät der Titel alles.
Wie generiere ich mit der DOS-Version von FreeBASIC denn Sound?
So wie in QBasic? Wenn ja, wie machte man das in QBasic? *g*
Das ist näml. der Teil von QBasic, von dem ich gänzlich keine Ahnung hatte..
Ich wär vollauf glücklich, wenn ich ne Wave abspielen kann, am besten Mehrkanal (Also mehrere Waves gleichzeitig). |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.08.2007, 15:32 Titel: |
|
|
Für sowas bräuchtest du entweder eine Sound-Bibliothek (die bekannten QB-Libs gehn aus verständlichen gründen nicht), oder einen DMA-Player, was aber so ohne weiteres natürlich nicht möglich ist, mangels Call Absolute. Wenn du dich trotzdem an einen DMA-Player ranwagen willst, schau dir den sourcecode von DMAPlay an und porte es nach FB Vergiss aber nicht, vorher einen Soundtreiber in DOS zu installieren... dieser schritt is unnötig bei guten PnP-Soundkarten wie z.B. der SoundBlaster AWE-Reihe  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.08.2007, 16:22 Titel: |
|
|
Hm, ich wollte das höchstens in DosBox testen *g*
Hm, dann lass ich halt den DOS-Port weg, Netzwerk gibts da eh nich (zumindest nich so einfach) |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 05.08.2007, 23:47 Titel: |
|
|
In QB ging mit beep ein einfaches Piepen und mit SOUND frequenz, länge ein Sound. Wenn ich mich richtig erinnere ging sogar so was wie Play "cdefgahc", aber meinen Tests zufolge geht nur Beep in FB.. |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.08.2007, 23:48 Titel: |
|
|
Wenn man weiß, wo, gibts auch die anderen Befehle, aber ich dachte eher an Soundkarte  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.08.2007, 23:49 Titel: |
|
|
Mit dem PC-Speaker ist es aber fast nicht möglich, Wave-Dateien abzuspielen, und darum geht's im ja. Und das Standard-Speaker-Gepiepse kann ziemlich nerven... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.08.2007, 23:51 Titel: |
|
|
Hehe, für Windows 3.11 hatte ich da so nen schönen Treiber
Dateien bis 5s im Waveformat ließen sich recht gut wiedergeben (damals waren die Speaker noch nicht aus Keramik und nervten, sondern waren hochqualitativ). Nur mit Midis klappts nicht - was aber auch bissl verständlich ist - obwohl, eigentlich...  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.08.2007, 23:53 Titel: |
|
|
jaja, sicher doch midi aufn virtuellen wavetable mappen, wavetable-ausgabe in wave umwandeln, an den speaker schicken.... ganz klar, mit nem 286er  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.08.2007, 23:54 Titel: |
|
|
falsch, ein 486er war es, 120er AMD DX4  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.08.2007, 23:55 Titel: |
|
|
aber das wäre dann ja auch schon das prinzip eines MODs...  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 05.08.2007, 23:57 Titel: |
|
|
Ist es das nicht ohnehin schon?
Ich glaub, man kann MIDI wirklich als Tracker-Format bezeichnen x)
Zumal beide ja recht gut harmoniern können....
aber EIGENTLICH hatte ich ja was ganz anderes gefragt *g* |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.08.2007, 23:59 Titel: |
|
|
den hier hab ich gefunden... kannst ja ma gucken ob den zum laufen bekommst
Code: |
'>>>>>>>>>WARNING<<<<<<<<<<<
'DO NOT PRESS CTRL-BREAK WHILE LISTENING TO YOUR SOUND!
'>>>>>>>>>WARNING<<<<<<<<<
start:
' By Mike Huff (1996)
' Replay addition by Kenneth Green
' Audio file player that plays using the DMA channels.
' Runs in QBASIC, QuickBASIC, PDS, VBDOS, and even GW-BASIC!!! (If you add
' line numbers and remove the SUBs, FUNCTIONS, and do a few other things.)
' Use DMADone% to detect the end of a transfer.
' Tested on a 486DX4-120mHz with a Reveal Sound FX card.
DECLARE FUNCTION SpeakerStatus% ()
DECLARE FUNCTION DMAStatus% ()
DECLARE FUNCTION DMADone% ()
DECLARE FUNCTION ResetDSP% ()
DECLARE SUB FMVolume (Right%, Left%, Getvol%)
DECLARE SUB VocVolume (Right%, Left%, Getvol%)
DECLARE SUB MasterVolume (Right%, Left%, Getvol%)
DECLARE SUB MicVolume (Gain%, Getvol%)
DECLARE SUB LineVolume (Right%, Left%, Getvol%)
DECLARE SUB CDVolume (Right%, Left%, Getvol%)
DECLARE SUB InputSource (InputSrc%, GetSrc%)
DECLARE SUB WriteDSP (byte%)
DECLARE SUB SetStereo (OnOff%)
DECLARE FUNCTION ReadDSP% ()
DECLARE SUB WriteDAC (byte%)
DECLARE SUB SpeakerState (OnOff%)
DECLARE SUB DMAState (StopGo%)
DECLARE FUNCTION ReadDAC% ()
DECLARE SUB DMAPlay (Segment&, Offset&, Length&, Freq&)
DECLARE SUB DMARecord (Segment&, Offset&, Length&, Freq&)
DECLARE SUB GetBLASTER (DMA%, BasePort%, IRQ%)
DECLARE FUNCTION DSPVersion! ()
COMMON SHARED BasePort%, LenPort%, Channel%
CLS
IF ty <> 0 THEN GOTO go3:
PRINT "DMAPlay .WAV PLAYER"
PRINT "By Mike Huff"
PRINT "Will play the first 32 KB of a .WAV file."
PRINT "Additions By Kenneth Green"
PRINT "Comments, etc. can be sent to MHuff@gnn.com or on FidoNet in the QUIK_BAS echo"
PRINT
PRINT "Do not press Crtl-Break while listening!"
PRINT "If the sound keeps playing, turn off the power to your computer!"
go3:
GetBLASTER Channel%, BasePort%, IRQ% ' Parses BLASTER environment
IF ty <> 0 THEN GOTO go4:
PRINT STRING$(80, 196)
IF ResetDSP% THEN 'resets DSP (returns true if sucessful)
PRINT "DSP reset sucessfully!"
ELSE
PRINT "DSP failed to reset, try another port."
END IF
go4:
SpeakerState 1 'turn the speaker on
IF ty <> 0 THEN GOTO go5:
PRINT "Sound Card DSP version:"; DSPVersion!
go5:
MasterVolume Right%, Left%, -1 'this puts the mixer volumes in Right% and Left%
IF ty <> 0 THEN GOTO go6:
PRINT "Master volume is set at: Right-"; Right%; " Left-"; Left%
go6:
MasterVolume 15, 15, 0 'this cranks the master volume all the way up.
DIM WavBuffer(1 TO 1) AS STRING * 32767 'Make a 32k buffer for file.
IF ty <> 0 THEN GOTO go:
inputting:
INPUT "WAV/VOC/SND file to play:(just enter to see a directory) ", Filename$
IF Filename$ = "" THEN GOTO fls:
INPUT "How many times would you like to hear it:", ti
IF ti < 1 THEN END
OPEN Filename$ FOR BINARY AS #1
go:
GET #1, 44, WavBuffer(1) 'Get 32k from file (skip header on WAV)
Length& = LOF(1) - 44
IF Length& > 32767 THEN Length& = 32767'Adjust length if needed to 32k
IF ty <> 0 THEN GOTO go2:
SEEK #1, 29
'Get the frequency
GET #1, , Freq&
'Print it just for kicks and giggles.
PRINT Freq&
go2:
DMAPlay VARSEG(WavBuffer(1)), VARPTR(WavBuffer(1)), Length&, Freq&
'Use DMARecord to record in the background.
'and use DMAPlay to playback the same buffer you recorded to or you could
'even write the buffer to a file.
'DMARecord VARSEG(WavBuffer(1)), VARPTR(WavBuffer(1)), Length&, Freq&
REM CLS
d = 1
DO
LOCATE 5, d
PRINT " "
d = d + 3
LOCATE 5, d
PRINT "Playing Your Sounds! "
FOR tm = 1 TO 7000: NEXT tm
IF d > 23 THEN d = 1
LOOP UNTIL DMADone%
CLS
COLOR 7
PRINT "DMA transfer completed!"
ty = ty + 1
IF ty = ti THEN END
GOTO start:
fls:
INPUT "Type a directory here:"; drc$
FILES drc$
GOTO inputting
SUB CDVolume (Right%, Left%, Getvol%)
OUT BasePort% + 4, &H28
IF Getvol% THEN
Left% = INP(BasePort% + 5) \ 16
Right% = INP(BasePort% + 5) AND &HF
EXIT SUB
ELSE
OUT BasePort% + 5, (Right% + Left% * 16) AND &HFF
END IF
END SUB
FUNCTION DMADone%
Count% = INP(LenPort%)
Count2% = INP(LenPort%)
Count& = CLNG(Count% + 1) * CLNG(Count2% + 1)
IF (Count& - 1) >= &HFFFF& THEN junk% = INP(DSPDataAvail%): DMADone% = -1
END FUNCTION
SUB DMAPlay (Segment&, Offset&, Length&, Freq&)
' Transfers and plays the contents of the buffer.
Length& = Length& - 1
Page% = 0
MemLoc& = Segment& * 16 + Offset&
SELECT CASE Channel%
CASE 0
PgPort% = &H87
AddPort% = &H0
LenPort% = &H1
ModeReg% = &H48
CASE 1
PgPort% = &H83
AddPort% = &H2
LenPort% = &H3
ModeReg% = &H49
CASE 2
PgPort% = &H81
AddPort% = &H4
LenPort% = &H5
ModeReg% = &H4A
CASE 3
PgPort% = &H82
AddPort% = &H6
LenPort% = &H7
ModeReg% = &H4B
CASE ELSE
PRINT "DMA channels 0-3 only are supported."
EXIT SUB
END SELECT
OUT &HA, &H4 + Channel%
OUT &HC, &H0
OUT &HB, ModeReg%
OUT AddPort%, MemLoc& AND &HFF
OUT AddPort%, (MemLoc& AND &HFFFF&) \ &H100
IF (MemLoc& AND 65536) THEN Page% = Page% + 1
IF (MemLoc& AND 131072) THEN Page% = Page% + 2
IF (MemLoc& AND 262144) THEN Page% = Page% + 4
IF (MemLoc& AND 524288) THEN Page% = Page% + 8
OUT PgPort%, Page%
OUT LenPort%, Length& AND &HFF
OUT LenPort%, (Length& AND &HFFFF&) \ &H100
OUT &HA, Channel%
IF Freq& < 23000 THEN
TimeConst% = 256 - 1000000 \ Freq&
WriteDSP &H40
WriteDSP TimeConst%
WriteDSP &H14
WriteDSP (Length& AND &HFF)
WriteDSP ((Length& AND &HFFFF&) \ &H100)
ELSE
IF DSPVersion! >= 3 THEN
TimeConst% = ((65536 - 256000000 \ Freq&) AND &HFFFF&) \ &H100
WriteDSP &H40
WriteDSP TimeConst%
WriteDSP (Length& AND &HFF)
WriteDSP ((Length& AND &HFFFF&) \ &H100)
WriteDSP &H91
ELSE
PRINT "You need a Sound Blaster with a DSP v3.x+ to play at high speed."
EXIT SUB
END IF
END IF
END SUB
SUB DMARecord (Segment&, Offset&, Length&, Freq&)
Length& = Length& - 1
MemLoc& = Segment& * 16 + Offset&
Page% = 0
SELECT CASE Channel%
CASE 0
PgPort% = &H87
AddPort% = &H0
LenPort% = &H1
ModeReg% = &H44
CASE 1
PgPort% = &H83
AddPort% = &H2
LenPort% = &H3
ModeReg% = &H45
CASE 2
PgPort% = &H81
AddPort% = &H4
LenPort% = &H5
ModeReg% = &H46
CASE 3
PgPort% = &H82
AddPort% = &H6
LenPort% = &H7
ModeReg% = &H47
CASE ELSE
EXIT SUB
END SELECT
OUT &HA, &H4 + Channel%
OUT &HC, &H0
OUT &HB, ModeReg%
OUT AddPort%, MemLoc& AND &HFF
OUT AddPort%, (MemLoc& AND &HFFFF&) \ &H100
IF (LongByte& AND 65536) THEN Page% = Page% + 1
IF (LongByte& AND 131072) THEN Page% = Page% + 2
IF (LongByte& AND 262144) THEN Page% = Page% + 4
IF (LongByte& AND 524288) THEN Page% = Page% + 8
OUT PgPort%, Page%
OUT LenPort%, Length& AND &HFF
OUT LenPort%, (Length& AND &HFFFF&) \ &H100
OUT &HA, Channel%
IF Freq& <= 23000 THEN
TimeConst% = 256 - 1000000 \ Freq&
WriteDSP &H40
WriteDSP TimeConst%
WriteDSP &H24
WriteDSP (Length& AND &HFF)
WriteDSP ((Length& AND &HFFFF&) \ &H100)
ELSE
IF DSPVersion! >= 3 THEN
TimeConst% = ((65536 - 256000000 / Freq&) AND &HFFFF&) \ &H100
WriteDSP &H40
WriteDSP TimeConst%
WriteDSP (Length& AND &HFF)
WriteDSP ((Length& AND &HFFFF&) \ &H100)
WriteDSP &H99
ELSE
PRINT "You need a Sound Blaster with a DSP 3.x+ to record at high speed."
EXIT SUB
END IF
END IF
END SUB
SUB DMAState (StopGo%)
' Stops or continues DMA play.
IF StopGo% THEN WriteDSP &HD4 ELSE WriteDSP &HD0
END SUB
FUNCTION DSPVersion!
' Gets the DSP version.
WriteDSP &HE1
Temp% = ReadDSP%
Temp2% = ReadDSP%
DSPVersion! = VAL(STR$(Temp%) + "." + STR$(Temp2%))
END FUNCTION
SUB FMVolume (Right%, Left%, Getvol%)
OUT BasePort% + 4, &H26
IF Getvol% THEN
Left% = INP(BasePort% + 5) \ 16
Right% = INP(BasePort% + 5) AND &HF
EXIT SUB
ELSE
OUT BasePort% + 5, (Right% + Left% * 16) AND &HFF
END IF
END SUB
SUB GetBLASTER (DMA%, BasePort%, IRQ%)
' This subroutine parses the BLASTER environment string and returns settings.
IF LEN(ENVIRON$("BLASTER")) = 0 THEN PRINT "BLASTER environment variable not set.": EXIT SUB
FOR Length% = 1 TO LEN(ENVIRON$("BLASTER"))
SELECT CASE MID$(ENVIRON$("BLASTER"), Length%, 1)
CASE "A"
BasePort% = VAL("&H" + MID$(ENVIRON$("BLASTER"), Length% + 1, 3))
CASE "I"
IRQ% = VAL(MID$(ENVIRON$("BLASTER"), Length% + 1, 1))
CASE "D"
DMA% = VAL(MID$(ENVIRON$("BLASTER"), Length% + 1, 1))
END SELECT
NEXT
END SUB
SUB InputSource (InputSrc%, GetSrc%)
OUT BasePort% + 4, &HC
IF GetSrc% THEN
InputSrc% = INP(BasePort% + 5) AND 2 + INP(BasePort% + 5) AND 4
ELSE
OUT BasePort% + 5, InputSrc% AND 7
END IF
END SUB
SUB LineVolume (Right%, Left%, Getvol%)
OUT BasePort% + 4, &H2E
IF Getvol% THEN
Left% = INP(BasePort% + 5) \ 16
Right% = INP(BasePort% + 5) AND &HF
EXIT SUB
ELSE
OUT BasePort% + 5, (Right% + Left% * 16) AND &HFF
END IF
END SUB
SUB MasterVolume (Right%, Left%, Getvol%)
OUT BasePort% + 4, &H22
'PRINT BasePort%
IF Getvol% THEN
Left% = INP(BasePort% + 5) \ 16
Right% = INP(BasePort% + 5) AND &HF
EXIT SUB
ELSE
OUT BasePort% + 5, (Right% + Left% * 16) AND &HFF
END IF
END SUB
SUB MicVolume (Volume%, Getvol%)
OUT BasePort% + 4, &HA
IF Getvol% THEN
Volume% = INP(BasePort% + 5) AND &HF
EXIT SUB
ELSE
OUT BasePort% + 5, Volume% AND &HF
END IF
END SUB
FUNCTION ReadDAC%
' Reads a byte from the DAC.
WriteDSP &H20
ReadDAC% = ReadDSP%
END FUNCTION
FUNCTION ReadDSP%
' Reads a byte from the DSP
DO
LOOP UNTIL INP(BasePort% + 14) AND &H80
ReadDSP% = INP(BasePort% + 10)
END FUNCTION
FUNCTION ResetDSP%
' Resets the DSP
OUT BasePort% + 6, 1
FOR Count% = 1 TO 4
junk% = INP(BasePort% + 6)
NEXT
OUT BasePort% + 6, 0
FOR Count% = 1 TO 4
junk% = INP(BasePort% + 6)
NEXT
IF INP(BasePort% + 14) AND &H80 = &H80 AND INP(BasePort% + 10) = &HAA THEN
ResetDSP% = -1
ELSE
ResetDSP% = 0
END IF
END FUNCTION
SUB SetStereo (OnOff%)
OUT BasePort% + 4, &HE
IF OnOff% THEN OUT BasePort% + 5, 2 ELSE OUT BasePort% + 5, 0
END SUB
SUB SpeakerState (OnOff%)
' Turns speaker on or off.
IF OnOff% THEN WriteDSP &HD1 ELSE WriteDSP &HD3
END SUB
FUNCTION SpeakerStatus%
OUT BasePort% + 4, &HD8
IF INP(BasePort% + 5) = &HFF THEN SpeakerStatus% = -1 ELSE SpeakerStatus% = 0
END FUNCTION
SUB VocVolume (Right%, Left%, Getvol%)
OUT BasePort% + 4, &H4
IF Getvol% THEN
Left% = INP(BasePort% + 5) \ 16
Right% = INP(BasePort% + 5) AND &HF
EXIT SUB
ELSE
OUT BasePort% + 5, (Right% + Left% * 16) AND &HFF
END IF
END SUB
SUB WriteDAC (byte%)
' Writes a byte to the DAC.
WriteDSP &H10
WriteDSP byte%
END SUB
SUB WriteDSP (byte%)
' Writes a byte to the DSP
DO
LOOP WHILE INP(BasePort% + 12) AND &H80
OUT BasePort% + 12, byte%
END SUB
|
_________________
 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.08.2007, 00:01 Titel: |
|
|
okay, dann werden wir mal die diskussion fortsetzen...
es gibt einen riesigen unterschied zwischen MIDI und MOD: Midi ist ein Sequencer-Format, MOD dagegen ein Tracker-Format. Was ist der Unterschied? simpel gesagt, Midis werden von links nach rechts angegezeigt /abgetastet, MODs dagegen von oben nach unten. Toll, ist ja nur die Anzeige. Das ist noch nicht alles. In MIDIs sind die Noten sozusagen gestreamt, eine nach der anderen, in einer Zeitleiste. Alles ein Strahl. MODs dagegen bestehen aus Patterns, die mehrfach auftreten können.
Gibt noch andere große Unterschiede, aber wir sind hier ja nicht in einem Musiker-, sondern einem Programmierer-Forum...
edit: @eternal_pain: das ist eine ältere Version von DMAPlay  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.08.2007, 00:05 Titel: |
|
|
aber doch blos grad mal 11 Jahre alt...
auf der FBC 16 glaub ich ging das Teil sogar.... _________________
 |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 06.08.2007, 00:13 Titel: |
|
|
Oo
Cool, danke, EternalPain
@Jojo:
Als was würdest du egtl. die DirectSound-Container definieren?
Die nutzen Patterns, geben aber Midi aus... unter anderem  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.08.2007, 00:17 Titel: |
|
|
hab's noch net angeguckt, aber wenn's nicht aus Patterns und Orders besteht, ist es kein Modul. und da ich noch NIE in irgend einem M$-Programm einen MOD-Player gesehn hab, denke ich, dass es eher ne Art Sequencer ist. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|