 |
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 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 08.10.2006, 19:38 Titel: Boxen per PEEK&POKE ansteuern... |
|
|
Weiß irgendjemand, wie ich mit PEEK&POKE auf den Computerboxen Töne ausgeben kann?
Ich weiß, ein bisschen verrückt, aber es interessiert mich
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 08.10.2006, 23:16 Titel: |
|
|
Wenn du mit Computerboxen die Lautsprecher meinst die an deiner Soundkarte hängen, dann muß ich dir sagen das es hier nicht mit ein paar Pokes getan ist.
Wenn du jedoch den internen Lautsprecher meinst, dann schau dir mal den Befehl PLAY an.
Ob man den internen Lautsprecher auch per Poke erreichen kann weis ich nicht? Ich denke wenn überhaupt dann per OUT oder über nen Interrupt. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 08.10.2006, 23:43 Titel: |
|
|
Das geht alles mit OUT.
Ich glaube Volta hat mal für FreeBASIC PLAY und SOUND "nachgebaut", da wurde das mit OUT gemacht. Ich such das mal schnell
Edit:
Code: |
Sub Sound(Byval freq As Uinteger, dur As Uinteger)
Dim t As Double,f1 As Unsigned Short
f1 = 1193181 \ freq
Out &h61,Inp(&h61) Or 3
Out &h43,&hb6
Out &h42,lobyte(f1)
Out &h42,hibyte(f1)
t=Timer
While ((Timer - t) * 1000) < dur
Sleep 0,1
Wend
Out &h61,Inp(&h61) And &hfc
End Sub
Sound(523, 60) 'C5
Sound(587, 60) 'D5
Sound(659, 60) 'E5
Sound(698, 60) 'F5
Sound(784, 60) 'G5
Sound(880, 60) 'A5
Sound(988, 60) 'B5
Sound(1046, 60) 'C6
|
War von Antoni und yetifoot, nicht von volta
Siehe englisches Forum _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 09.10.2006, 13:22 Titel: |
|
|
@programmierer
Danke, aber das ist leider nicht das was ich brauche
@E-P-S
Ich meine die, die an der Soundkarte hängen
Weißt du zuuufällig wie das im groben geht?
Wenn möglich mit Interrputs, da Q(uick)Basic sicher zu langsam ist, ein
Geräusch zu erstellen...
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 09.10.2006, 13:34 Titel: |
|
|
Achso, dann sag das doch
Guck mal auf qbasic.de, da unter downloads und dann die rubrik "sound".
Da steht ein Programm, welches ne WAVE datei über die lautsprecher abspielt, die an der Soundkarte liegen. Wenn ich mich nicht ganz täusche, dann ist da ein programm, welches das mit out oder mit interrupts macht. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 09.10.2006, 15:32 Titel: |
|
|
Also über die Soundkarte ist das nicht sehr einfach.
Ich hab das vor Jahren mal gemacht, hab dabei jedoch eine Soundkarte geschrottet.
Geht aber auch alles über OUT Befehle. Dazu gehört auch DMA Programmierung usw.
Ich hätte nen Quellcode noch rumliegen der auf SoundBlaster kompatiblen Karten WAVEs abspielen kann. Da diese wiederum vom Aufbau her recht einfach sind, könnte man sich die Werte einzelner Töne als WAVE erzeugen (was ich auch schon gemacht habe) und diese dann abspielen.
Für das reine abspielen dient dieser Code (Für die Funktionalität übernehme ich keine Garantie):
Code: | 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%)
DECLARE FUNCTION DSPVersion! ()
DECLARE SUB SetReg (Reg%, Value%)
CONST BaseAddr = &H220
CONST RegAddr = BaseAddr + 8
CONST DataAddr = BaseAddr + 9
DEFINT A-Z
COMMON SHARED BasePort%, LenPort%, Channel%
GetBLASTER Channel%, BasePort%
IF ResetDSP% THEN
PRINT
ELSE
PRINT
END IF
SpeakerState 1
MasterVolume Right%, Left%, -1
MasterVolume 10, 10, 0
DIM WavBuffer(1 TO 1) AS STRING * 32767
'Filename$ = "C:\EPS\SOUND\WAVE\DING.WAV"
Filename$ = "C:\Ralph\sound\menu_1.WAV"
OPEN Filename$ FOR BINARY AS #1
GET #1, 44, WavBuffer(1)
Length& = LOF(1) - 44
IF Length& > 32767 THEN Length& = 32767
CLOSE #1
Freq& = 22000
DMAPlay VARSEG(WavBuffer(1)), VARPTR(WavBuffer(1)), Length&, Freq&
SLEEP 1
DEFSNG A-Z
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&)
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 GetBLASTER (DMA%, BasePort%)
IF LEN(ENVIRON$("BLASTER")) = 0 THEN
PRINT "BLASTER Umgebungsvariable nicht gefunden."
EXIT SUB
END IF
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 "D"
DMA% = VAL(MID$(ENVIRON$("BLASTER"), Length% + 1, 1))
END SELECT
NEXT
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%
OUT BasePort% + 6, 1
FOR Count% = 1 TO 4
junk% = INP(BasePort% + 6)
NEXT
OUT BasePort% + 6, 0
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%)
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 WriteDAC (byte%)
' Writes a byte to the DAC.
WriteDSP &H10
WriteDSP byte%
END SUB
SUB WriteDSP (byte%)
DO: LOOP WHILE INP(BasePort% + 12) AND &H80
OUT BasePort% + 12, byte%
END SUB |
Für das erzeugen verschiedener Töne bzw. Frequenzen hab ich auch mal ein Programm gemacht: http://eps.designdevil.de/index.php?show=software/progs/oszi leider hab ich aber den Quellcode nicht mehr.
Ich hoffe das dir das weiterhilft. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 09.10.2006, 17:25 Titel: |
|
|
also um waves abzuspielen dient unter qb typischerweise das bereits gepostete programm DMAPlay. schau nach version 3.0 und 6.0 auf qbasic.de nach 3.0 is kompakter, kann dafür aber keine 16 bitsounds und sounds über 23000 hz abspielen. es ist auch mit OUT möglich. aber das hat folgende nachteile: du müsstest - sehr umständlich - die ausgabe der prozessorgeschwindigkeit anpassen, und die schwankt nunmal immer, also ist es de facto unmöglich, einen guten sound so auszugeben. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 09.10.2006, 17:33 Titel: |
|
|
E-P-S hat Folgendes geschrieben: |
...könnte man sich die Werte einzelner Töne als WAVE erzeugen (was ich auch schon gemacht habe) und diese dann abspielen...
|
Da hab ich auch schon dran gedacht...
Ich dachte allerdings, dass QBasic zu langsam dafür sei, wenn man richtige Klänge abspielen will...
Ich denke das werde ich machen!
@programmierer
Das Programm von qbasic.de funktioniert bei mir leider nicht, sonst wärs prima!
Ich danke euch beiden...
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 09.10.2006, 17:36 Titel: |
|
|
das programm von programmierer ( ) is ja für den pc-speaker, nicht für die soundkarte...  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 09.10.2006, 17:40 Titel: |
|
|
Er redet ja auch vom Programm von Qbasic und nicht vom Programm von Mir
PS: Habs lieber wenn ihr mich Michael nennt  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 09.10.2006, 17:43 Titel: |
|
|
dann müsste dein rang "aka anfänger aka michael" lauten  _________________ » 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.
|
|