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:

Morsezeichen abspielen nach länge eines Tastendruckes

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



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 12.05.2011, 16:50    Titel: Morsezeichen abspielen nach länge eines Tastendruckes Antworten mit Zitat

Hallo, ich habe eine Wav mit einem Morseton ca 3 Sekunden lang.
Ich habe das "FMOD-Tutorial" runtergeladen und es funktioniert mit der FMod.dll .

Nun möchte ich nach länge eines Tastendruckes ein Morsezeichen kurz oder lang senden bzw abspielen aus dieser Wav oben.

Wie kann man das machen?

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 12.05.2011, 17:20    Titel: Antworten mit Zitat

Z. B: mit MULTIKEY kannst du feststellen, ob eine bestimmte Taste gedrückt ist oder nicht. Du kannst dann, wenn die gewünschte Taste gedrückt wird, die Wiedergabe anschalten, und wenn sie nicht mehr gedrückt ist, die Wiedergabe wieder ausschalten. Wie das mit dem Ein- und Ausschalten geht, musst du bei FMOD nachsehen, das weiß ich nicht.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 12.05.2011, 22:14    Titel: Antworten mit Zitat

Das wird so nicht funktionieren, ich brauche eine Überprüfung für Key-down und Key-up.

Gibt es die in Freebasic?

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 12.05.2011, 22:35    Titel: Antworten mit Zitat

Nun ja, du kannst es mit Threads probieren. Oder du schaust dir SCREENEVENT an.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 12.05.2011, 23:01    Titel: Antworten mit Zitat

So kann man es auch machen:
Code:
#Define KEY_UP &H01
#Define KEY_DOWN &H02
#Define KEY_PRESSED &H03

Function Key ( ByVal K As UByte ) As Integer
   Static State(0 To 255) As Byte
   Dim Ke As Integer
   Function = 0
   Ke = MultiKey(K)
   If Ke Then
      If State(K) Then
         Function = KEY_PRESSED
      Else
         Function = KEY_DOWN
      EndIf
   Else
      If State(K) Then
         Function = KEY_UP
      EndIf
   EndIf
   State(K) = Ke
End Function

Do
   Sleep 1,1
   Select Case Key(1)
      Case KEY_UP
         Print "ESC up"
      Case KEY_DOWN
         Print "ESC down"
      Case KEY_PRESSED
         'Print "ESC pressed"
      Case Else
         'Print "ESC not Pressed"
   End Select
Loop Until InKey = Chr(255)+"k"

die function key(welcher key - genauso wie bei multikey) als ausgeabe der state.
0 = Nicht Gedrueckt
1 = Losgelassen
2 = Down
3 = Gedrueckt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 12.05.2011, 23:18    Titel: Antworten mit Zitat

Jup, danke.


Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 13.05.2011, 08:54    Titel: Antworten mit Zitat

jetzt funktioniert es. Danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 13.05.2011, 10:39    Titel: Antworten mit Zitat

Man kann es auch kompliziert machen, oder einfach auf den allerersten Tipp setzen:

Code:
If MultiKey(fb.SC_SPACE) Then
    'Abspielen
Else
    'Anhalten
EndIf


Das Ganze noch mit einer Schleife versehen und der fbgfx.bi für die Key-Definition und schon hast du ein laufendes Programm, das auf Knopfdruck abspielt und beim Loslassen stoppt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 13.05.2011, 15:08    Titel: Antworten mit Zitat

Habe jetzt mal das Event genommen, weil das mit Multikey beim dauerdrücken den Ton immer wieder ein bisschen zerhackt(schnarrt).

Beim Event fängt der Ton sofort deutlich an und beim loslassen sofort ein Tonstop. Es ist ein klarer Morseton, je nach länge der gedrückten Taste.
Ich habe mit Audacity ein 3sek Sinuston als wav aufgenommen.

Durch die Loopschleife in Fmod kann man die Taste solange drücken wie man möchte und man merkt nicht die Tonschleife.
Das FMod ist schon eine tolles Soundprogramm.

Code:

#include "fbgfx.bi"
#Include "fmod.bi"

Dim fmorse As FSOUND_SAMPLE Ptr
Dim Shared As Integer cmorse
DIM AS FB.EVENT PTR event

event = ALLOCATE(20)

SCREEN 19,32

FSOUND_Init(44100, 32, 0)
fmorse = FSOUND_Sample_Load(FSOUND_FREE, "morseton.wav", FSOUND_LOOP_NORMAL, 0, 0)

DO
   If (SCREENEVENT(event)) Then
      Select CASE event->type
         Case FB.EVENT_KEY_PRESS
             IF (event->scancode = FB.SC_ESCAPE) THEN End
             
            If (event->ascii =113) Then
               FSOUND_PlaySound(FSOUND_LOOP_NORMAL, fmorse)
            End If         
         Case FB.EVENT_KEY_RELEASE
            If (event->ascii =113) THEN
               FSOUND_StopSound(FSOUND_LOOP_NORMAL)   
            End If
      END SELECT
    END IF

    SLEEP 1
LOOP
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 13.05.2011, 16:26    Titel: Antworten mit Zitat

Mit MULTIKEY darfst du dann natürlich nicht, solange die Taste gedrückt ist, immer wieder neu mit der Wiedergabe starten, sondern nur bei einem Wechsel von nicht-gedrückt zu gedrückt. Sonst wird der Ton zerhackt.

Zu deinem Programm: einen mit ALLOCATE belegten Speicherbereich sollte man am Ende mit DEALLOCATE wieder frei geben. Ich habe das mal in der Referenz ergänzt.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 13.05.2011, 21:30    Titel: Antworten mit Zitat

Wiso mit Allocate arbeiten?
man kann doch auch einfach event als FB.EVENT dimen und dann mit ScreenEvent(@event) das event bekommen und danach Select CASE event.type so kann man sich das Allocaten und Deallocaten sparen.
so ungefaehr
Code:
#include "fbgfx.bi"
#Include "fmod.bi"

Dim fmorse As FSOUND_SAMPLE Ptr
Dim Shared As Integer cmorse
Dim As FB.EVENT event

Screen 19,32

FSOUND_Init(44100, 32, 0)
fmorse = FSOUND_Sample_Load(FSOUND_FREE, "morseton.wav", FSOUND_LOOP_NORMAL, 0, 0)

Do
   If (ScreenEvent(@event)) Then
      Select Case event.type
         Case FB.EVENT_KEY_PRESS
            If (event.scancode = FB.SC_ESCAPE) Then
               FSOUND_Sample_Free(fmorse)
               FSOUND_Close()
               End
            EndIf
             
            If (event.ascii =113) Then
               FSOUND_PlaySound(FSOUND_LOOP_NORMAL, fmorse)
            End If         
         Case FB.EVENT_KEY_RELEASE
            If (event.ascii =113) Then
               FSOUND_StopSound(FSOUND_LOOP_NORMAL)
            End If
      End Select
   End If

   Sleep 1
Loop

ich arbeite nicht mit fmod aber ich denke man sollte den sound auch wieder freigeben FSOUND_Sample_Free(fmorse) und fmod beenden FSOUND_Close()
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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