Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 12.05.2011, 16:50 Titel: Morsezeichen abspielen nach länge eines Tastendruckes |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 12.05.2011, 17:20 Titel: |
|
|
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 |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 12.05.2011, 22:14 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 12.05.2011, 22:35 Titel: |
|
|
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 |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 12.05.2011, 23:01 Titel: |
|
|
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 |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 12.05.2011, 23:18 Titel: |
|
|
Jup, danke.
Gruss |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 13.05.2011, 08:54 Titel: |
|
|
jetzt funktioniert es. Danke.
Gruss |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 13.05.2011, 10:39 Titel: |
|
|
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 |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 13.05.2011, 15:08 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 13.05.2011, 16:26 Titel: |
|
|
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 |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 13.05.2011, 21:30 Titel: |
|
|
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 |
|
 |
|