je voudrais une fonction pour generer un signal sonore a une cetaine frequence comme le Windows.sleep de la FAQ mais sur les HP et une fonction pour recuperer cette frequence sur une entree ligne merci beaucoup et a bientot
je voudrais une fonction pour generer un signal sonore a une cetaine frequence comme le Windows.sleep de la FAQ mais sur les HP et une fonction pour recuperer cette frequence sur une entree ligne merci beaucoup et a bientot
personne n'a d'idée??
svp
Il doit bien y avoir ces composants TToneGen et TMidiGen, ici :
http://www.alan-warriner.co.uk/ , dans la rubrique Software...
Bidouilleuse Delphi
merci waskol mais je viens de le telecharger et de regarder la demo je pense que ce composant est bien mais trop evolu il n'y a pas juste une fonctionpour envoyer du 1000 ou 400 hz
Tu veux dire Windows.Beep(Ton,durée:cardinal) certainement ?Envoyé par jmjmjm
Oui, pour faire la même faire sur une carte son, c'est l'enfer sous Windows
Bidouilleuse Delphi
J'ai trouvé un truc, là :
http://www.swissdelphicenter.ch/torr...de.php?id=1324
// How to call the function:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 uses MMSystem; type TVolumeLevel = 0..127; procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel); {writes tone to memory and plays it} var WaveFormatEx: TWaveFormatEx; MS: TMemoryStream; i, TempInt, DataCount, RiffCount: integer; SoundValue: byte; w: double; // omega ( 2 * pi * frequency) const Mono: Word = $0001; SampleRate: Integer = 11025; // 8000, 11025, 22050, or 44100 RiffId: string = 'RIFF'; WaveId: string = 'WAVE'; FmtId: string = 'fmt '; DataId: string = 'data'; begin if Frequency > (0.6 * SampleRate) then begin ShowMessage(Format('Sample rate of %d is too Low to play a tone of %dHz', [SampleRate, Frequency])); Exit; end; with WaveFormatEx do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := Mono; nSamplesPerSec := SampleRate; wBitsPerSample := $0008; nBlockAlign := (nChannels * wBitsPerSample) div 8; nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; cbSize := 0; end; MS := TMemoryStream.Create; with MS do begin {Calculate length of sound data and of file data} DataCount := (Duration * SampleRate) div 1000; // sound data RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) + SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data {write out the wave header} Write(RiffId[1], 4); // 'RIFF' Write(RiffCount, SizeOf(DWORD)); // file data size Write(WaveId[1], Length(WaveId)); // 'WAVE' Write(FmtId[1], Length(FmtId)); // 'fmt ' TempInt := SizeOf(TWaveFormatEx); Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record Write(DataId[1], Length(DataId)); // 'data' Write(DataCount, SizeOf(DWORD)); // sound data size {calculate and write out the tone signal} // now the data values w := 2 * Pi * Frequency; // omega for i := 0 to DataCount - 1 do begin SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate Write(SoundValue, SizeOf(Byte)); end; {now play the sound} sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC); MS.Free; end; end;
C'est vraiment n'importe quoi de devoir faire toute cette gymnastique pour sortir un bête son sous Windows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.Button1Click(Sender: TObject); begin MakeSound(1200, 1000, 60); end;
Bidouilleuse Delphi
Merci waskol un peu long comme tu dis mais c'est niquel par contre tu sais comment faire l'inverse !! c'est a dire recup la frequence d'un signal qui entre sur la carte son !!
Ben, heu... (toussements) non
Bidouilleuse Delphi
Pour la petite explication, tu connais la SSTV ??
c'est l'envoie d'image par ondes radio le principe est d'envoyer une BF 300-3400 et de la recevoir demodulé de l'autre coté
Et donc je cherche a faire un semblant de SSTV
Je vois !
Pourquoi ne pas s'inspirer des utilitaires de conversion K7 audio-->Wav (et vice-versa), qui accompagnent certains émulateurs de vieux micros et qui sont openSource ?
Par exemple, tu va trouver ton bonheur ici par exemple : http://oric.free.fr/emulator.html, dans la partie Tools tu trouvera la TapeTools collection (avec code sources en c).
Il doit y avoir la même chose pour les formats K7 Amstrad CPC464 et Spectrum avec le format de fichier .TZX
Après, la procédure est la suivante
1) Création d'un fichier K7, c'est à dire : en-tête de K7+données
2) transformation en fichier WAV
3) Jouer le son WAV
....
....transmission par les airs
....
4) réception du son et enregistrement du fichier Wav
5) décodage WAV2TAP (Wav vers format de K7)
6) récupération des données
L'avantage de passer par là, c'est que le traitement du signal est déjà maché...
Normalement et honnetement, celà devrait être jouable...
En tout cas, c'est ce que je ferais
Bidouilleuse Delphi
Je ne vois pas comment recupere la frequence du signal avec ca ?
Personne n'a d'autre idée??
En fait, avec cette technique de "K7 audio" virtuelle, tu n'as pas besoin de générer ni de détecter des fréquences !
Franchement je pense qu'essayer de faire comme ça vaut le coup.
Le décodage du fichier Wav en K7 devrait te redonner un fichier binaire identique à celui que tu as envoyé.
Bidouilleuse Delphi
Je crois que l'on ne sait pas tres bien compris pour la récéption je me reexplique le principe est de recevoir un signal sur l'entree ligne et de l'analysé.
L'analyse consiste a recuperer la frequence du signal pas la frequence d'echantillonage mais la frequence joué en effet si le signal BF est du 400hz je veux que la fonction me retourne 400 en gros je signal varie dans la bande passante de la parole soit 300-3000Hz. Est ce que j'ai été plus clair ??
Pour des precisions SSTV
Bah oui, j'ai parfaitement compris.
Il faut que tu comprennes que ton "interface SSTV" (le modem), c'est la partie qui encode les données en WAV et vice-versa.
En fait j'ai l'impression que tu veux mélanger à la fois réception (emission) et décodage (encodage), bref dès que tu as reçu une fréquence, la décoder de suite . Pour en faire quoi ? Ce ne sont pas les fréquences prises individuellement qui ont un sens ("Le point est vert"), mais une séquence complète (Un point vert+1 bleu+1 rouge+ etc=une image).
Donc, je pense qu'il faut que tu scinde ton problème en deux, et qui pourront sans doute se combiner ensuite.
1) tu réceptionnes le signal (création d'un fichier WAV lors de la réception du son par le micro ou l'entrée ligne (c'est kif-kif))--> voir comment fonctionne la méthode record du TMediaPlayer
2) tu transformes ce fichier WAV, qui représente une séquence de fréquences, en fichier binaire --> code c++ de WavToTap, qui converti les fréquences en valeurs numériques.
Le principe de fonctionnement des K7 audio des vieux Micro-ordinateurs 8 bits (commodore 64, CPC464, ZX spectrum, Oric, etc...) n'est ni plus ni moins le même que celui de la SSTV, qui n'a donc ABSOLUMENT RIEN inventé de ce coté là.
Pour t'en convaincre : as tu déjà écouté une K7 audio sur laquelle on a enregistré un programme ???
Je peux t'assurer que l'on parle bien de la hauteur de la note jouée (fréquence du signal) et non de la fréquence d'échantillonnage (qui est la vitesse à laquelle seront transmise les données.
Si je me trompe, n'hésites pas à me rectifier.
Bidouilleuse Delphi
[dans la bande passante de la parole soit 300-3000Hz. Est ce que j'ai été plus clair ??
Attends dans un son, tu as sa hauteur donc effectivement sa fréquence mais aussi son intensité (amplitude des vibrations) et son timbre qui dépend de la forme de la vibration.
et c'est le timbre qui permet à l'oreille de différencier des sons complexes de même hauteur.
alors ton bip à fréquence donnée est loin de restituer quelque chose d'intelligible !!!
Ok waskol je pense que je vais regarder ta fonction mais cela ne change rien a mon probleme il faut que je detecte les frequence en temps reel et non en lisant un enregistrement car il faut que je dise a mon prog de commencer l'enregistrement a la frequence de syncro et terminer l'enregistrement a cette meme frequence donc je dois quand meme pouvoir "lire" ma frequence en temps reel
Mais non !
Il faut que tu dise à ton programme de commencer l'enregistrement non pas à la fréquence de synchro (qui te sert d'amorce blanche) mais à la fin d'un silence, puis d'arrèter l'enregistrement lorsque'un nouveau silence commence.
A partir de là, il va falloir que tu détermine un "seuil" de niveau sonore en deça duquel tout ce qui sera reçu du micro sera un silence.
Je pense que ça va ête la partie la plus "coton" a développer.
Bidouilleuse Delphi
Je ne peux pas jouer avec les silence car si la liaison n'est pas terrible a chaque silence mon prog va planter je veux me servir des protocoles deja existant pour que le prog sois compatible avec ceux existant et donc je dois jouer avec la frequence de synchro de 1200Hz et non avec les silences
ha oui, là effectivement ça change tout...
En tout cas, ton problème aura eu le mérite de d'être TRES intéressant et original.
Je te souhaite bon courage et te prie de recevoir tout mes voeux de succès.
Bidouilleuse Delphi
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager