Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Boxen per PEEK&POKE ansteuern...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Elvis



Anmeldungsdatum: 01.06.2006
Beiträge: 818
Wohnort: Deutschland, BW

BeitragVerfasst am: 08.10.2006, 19:38    Titel: Boxen per PEEK&POKE ansteuern... Antworten mit Zitat

Weiß irgendjemand, wie ich mit PEEK&POKE auf den Computerboxen Töne ausgeben kann? grinsen

Ich weiß, ein bisschen verrückt, aber es interessiert mich zwinkern durchgeknallt mit dem Kopf durch die Mauer wollen



Grüße, Elvis
_________________
Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 08.10.2006, 23:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 08.10.2006, 23:43    Titel: Antworten mit Zitat

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 happy

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 grinsen
Siehe englisches Forum
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Elvis



Anmeldungsdatum: 01.06.2006
Beiträge: 818
Wohnort: Deutschland, BW

BeitragVerfasst am: 09.10.2006, 13:22    Titel: Antworten mit Zitat

@programmierer
Danke, aber das ist leider nicht das was ich brauche weinen zwinkern

@E-P-S
Ich meine die, die an der Soundkarte hängen durchgeknallt
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... happy


Grüße, Elvis
_________________
Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 09.10.2006, 13:34    Titel: Antworten mit Zitat

Achso, dann sag das doch grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 09.10.2006, 15:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 09.10.2006, 17:25    Titel: Antworten mit Zitat

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 zwinkern 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elvis



Anmeldungsdatum: 01.06.2006
Beiträge: 818
Wohnort: Deutschland, BW

BeitragVerfasst am: 09.10.2006, 17:33    Titel: Antworten mit Zitat

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... lächeln
Ich dachte allerdings, dass QBasic zu langsam dafür sei, wenn man richtige Klänge abspielen will... durchgeknallt
Ich denke das werde ich machen!

@programmierer
Das Programm von qbasic.de funktioniert bei mir leider nicht, sonst wärs prima! mit den Augen rollen lachen

Ich danke euch beiden... lächeln


Grüße, Elvis
_________________
Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 09.10.2006, 17:36    Titel: Antworten mit Zitat

das programm von programmierer ( durchgeknallt ) is ja für den pc-speaker, nicht für die soundkarte... mit den Augen rollen
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 09.10.2006, 17:40    Titel: Antworten mit Zitat

Er redet ja auch vom Programm von Qbasic und nicht vom Programm von Mir durchgeknallt

PS: Habs lieber wenn ihr mich Michael nennt grinsen
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 09.10.2006, 17:43    Titel: Antworten mit Zitat

dann müsste dein rang "aka anfänger aka michael" lauten durchgeknallt
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz