Bonjour,
Le titre est assez explicite, je cherche un outil qui mesure les décibels en JAVA, et si cela n'existe pas, éventuellement le nom d'un logiciel qui fait cela pour remplacer...
Merci !
Version imprimable
Bonjour,
Le titre est assez explicite, je cherche un outil qui mesure les décibels en JAVA, et si cela n'existe pas, éventuellement le nom d'un logiciel qui fait cela pour remplacer...
Merci !
Tu veux dire à partir d'un micro?
Je n'en sais trop rien, mais pour gérer ton micro, je pense qu'il te faudra utiliser l'api java-media/sound.
Ensuite il doit surement y avoir la posibilité de mesurer, du moins aproximativement, l'intencité de ton flux audio..
Mais j'en sais pas plus...
Merci, j'vais étudier la question :)
Salut,
je suppose que tu as un micro et les librairies indiquées par nabodix.
Tu vas obtenir la courbe de position de la membrane de ton micro. Cette membrane est sensible aux sons et est d'un modèle similaire aux membranes des hauts-parleurs. La différence entre les deux systèmes est que dans un cas on envoie le signal à la membrane (haut-parleurs) et dans l'autre, on lit ce signal.
Tu te retrouves avec une courbe de valeurs, et c'est à partir de là que mes souvenirs de physique deviennent flous. Les valeurs en décibels seront obtenue par lecture de la différence entre deux valeurs successives de la courbe.
Le minimum sera entre deux valeurs identiques, la courbe plate ne produit aucun son. C'est comme si une corde de guitare ne bouge pas. Même si tu la tends au maximum, elle ne produit aucun son. Tu dois la relâcher pour produire un son et c'est le mouvement de la corde qui va faire vibrer l'air autour, lequel va être compressé et amplifié par la caisse de résonnance.
Le maximum de décibels enregistrables pour ton micro sera l'écart entre sa valeur maximale et sa valeur minimale. Au-delà de ces seuils, il y a saturation, mais tu ne pourras pas mesurer au-delà des possibilités de ton micro.
Après tu devrais obtenir ta valeur en décibels par une règle de 3.
Soit dif ton écart de son. Soient minVal et maxVal les valeurs seuils du signal que tu lis dans ton programme. Soit maxDec le volume maximal que ton micro peut supporter. Soit res la valeur en décibels.
Tu devrais avoir :
Mais vérifie avec des cours de physique qu'il n'y a pas un logarithme qui traine autour de cette équation. Les mathématiques du son sont assez pénibles...Code:
1
2 res = dif * maxDec / (maxVal - minVal);
Hors Java, tu as le logiciel SoundForge qui dispose d'un mesureur décibels dans son panneau d'enregistrement.
Halte la !
Merci pour ces informations, mais je crois m'être mal exprimé =)
Je veux juste une sorte d'accusé de réception que le micro est opérationnel.
J'ai fouillé un peu JAVA sound, apparement c'est avec sampled en streaming, j'ai trouvé des exemples d'enregistreur qui marchent, mais moi j'veux pas passer par un fichier et tout le tointoin, je veux juste un petit indicateur qui dit "ok c'est bon ton micro marche".
J'ai trouvé des gens désirant la même chose, je me lance et je vous tiens au courant.
(dans mes fouilles j'ai trouvé un topic sur toi anadoncamille, mais me suis rendu compte a regret que ça concernait java.sound.midi :cry: )
Merci encore =)
Il est difficile d'avoir un signal qui dirait, "ton micro marche". Le principe d'une carte son est qu'elle fonctionne en continu. Que l'on ait un micro branché ou non dessus, elle récupèrera toujours un minimum de parasites.
Vrai :o
Mais disons marquer un signal plus fort, ou qui soit différentiable des parasites quand on utilise le micro, Mr uther Lightbringer.
La j'ai déniché pour l'enregistrement, j'vais analyser ce code.
Désolé pour les détails je croyais que tu voulais faire un mesureur d'intensité sonore, j'ai eu à en faire un en électronique pour un malentendant qui voulait cependant connaître le volume du son dans sa maison pour calibrer les micros de son alarme. Mais c'était il y a un bail ...
Sinon il faut que tu détermines les seuils d'intensité des parasites et que tu décides qu'au-delà d'un certain seuil, il y a un micro et du son qui lui parvient.
Hello,
Voila des petites nouvelles j'ai trouvé dans java sound api la possibilité de configurer un séquencer, qui est parfaitement ce que je recherche (je crois :o )
Il s'agit donc de capter le flux qui vient du microphone et de le lire a l'aide du séquencer.
Cependant, il me renvoie l'erreur suivante, et je ne suis pas a même de la comprendre...
Citation:
Exception in thread "main" java.lang.ClassCastException: com.sun.media.sound.PortMixer$PortMixerPort cannot be cast to javax.sound.sampled.TargetDataLine
at zoubidou.<init>(zoubidou.java:35)
at zoubidou.main(zoubidou.java:92)
Voici mon code (en tout et pour tout, ceci est ma seule classe dans son intégralité).
Code:
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
69
70
71
72
73
74
75
76
77
78
79
80
81 import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiEvent; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Sequence; import javax.sound.midi.Sequencer; import javax.sound.midi.ShortMessage; import javax.sound.midi.Track; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Port; import javax.sound.sampled.TargetDataLine; //import javax.swing.*; public class zoubidou{ private static Sequencer Vumetre; private TargetDataLine line ; private Sequence zozo; private Track piste; public zoubidou(){ if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)){ try{ line = (TargetDataLine) AudioSystem.getLine(Port.Info.MICROPHONE); System.out.print(line); }catch(LineUnavailableException ex){ ex.printStackTrace(); } } try { Vumetre = MidiSystem.getSequencer(); } catch (MidiUnavailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (Vumetre == null){ System.out.print("raté!"); }else{ try { Vumetre.open(); } catch (MidiUnavailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try{ zozo = new Sequence(Sequence.PPQ, 10); zozo.createTrack(); }catch (Exception ex){ ex.printStackTrace(); } zozo.createTrack(); try { Vumetre.setSequence(zozo); } catch (InvalidMidiDataException e) { // TODO Auto-generated catch block e.printStackTrace(); } Vumetre.recordEnable(piste, 0); Vumetre.startRecording(); do{ System.out.print(" "); } while (1==1); } public static void main (String args[]){ new zoubidou(); Vumetre.stop(); } }
Salut,
l'erreur est due à la classe du résultat de la fonction AudioSystem.getLine(Port.Info.MICROPHONE);
Rien ne garantit que ce soit une TargetDataLine, tu dois utiliser à la place l'interface Line.