# Audiofile/Audiostream auswerten



## proXy (10. Mai 2005)

Also ich hab ein Audiofile das ich irgendwie auswerten soll, ist mir überlassen. Ich habs mal so gemacht das ich über Mikrofonschnittstelle einen Sound vom keyboard einlese also zB den A ton, ich soll dann den ton auswerten also sprich herausfinden welcher ton das war und wenn jemand zb auf dem Keyboard den A Ton drückt öffnet sich der explorer und wenn man den H ton drückt ein anderes fenster. Ich soll nur unterscheiden können welchen ton ich eingelesen habe ohne das ich zb 2 soundfiles einfach vergleiche hat jemand ne ahnung wie ich das am besten lösen kann. Zurzeit bin ich soweit das ich das eingelesene audiofile mit frequenz anzeigen lassen kann nur gerade sitz ich damit fest


----------



## Guest (10. Mai 2005)

:autsch: krank...

sorry ossi. aber do wird uns keina weiter helfen kenna  :cry:


----------



## proXy (17. Mai 2005)

mhm einer ne ahnung wie ich es lösen könnte oder umgehen .... das ich zum gewünschten ergebnis komme


----------



## Luma (17. Mai 2005)

Keine Ahung aber schauh mal im Javakompedium nach, da steht was zu Audiodateien drin...


P.S: Liest du mit deinem Proggi die Daten der Mikrofonschnittstelle?? Wenn ja wie. Würd mich doch sehr interessieren, auch wenn's deinem Problem nicht weiter hilft.


----------



## stev.glasow (17. Mai 2005)

Mit MIDIs sollte das eigentlich ganz gut gehn:
hab mal was zusammen kopiert:


```
//		   Sequencer sequencer = MidiSystem.getSequencer();
//		   Transmitter trans = sequencer.getTransmitter();
//		   Synthesizer synth = MidiSystem.getSynthesizer();
//		   Receiver rcvr = synth.getReceiver();
//		   
//		   sequencer.open();
//		   synth.open();
//		   trans.setReceiver(rcvr);
		   Sequence seq = MidiSystem.getSequence(new File("entchen.mid"));
		   Track[] tracks = seq.getTracks();
		   for(int i = 0; i < tracks.length; i++){
			   Track t = tracks[i];
			   System.out.println("Track "+(i+1)+" (" + t.ticks() + " Ticks, "+ t.size()  +" Events):");
			   for(int k = 0; k < t.size(); k++ ){
				   MidiEvent me = t.get(k);
				   byte[] msg = me.getMessage().getMessage();
				   for(int m = 0; m < msg.length; m++){
					   int b = (int)(msg[m] & 0xFF);
//					   int b = msg[m];
					   System.out.print(b + " ");
				   }
				   System.out.println();
			   }
			   
		   }


//		   sequencer.setSequence(seq);
//		   //sequencer.setTempoInBPM(145);
//		   sequencer.start();
//		   while (true) {
//			       try {
//			         Thread.sleep(100);
//			          } catch (Exception e) {
//			           //nothing
//			         }
//			          if (!sequencer.isRunning()) {
//			            break;
//			         }
//			        }
//			      //Sequencer anhalten und Geräte schließen
//			        sequencer.stop();
//			      sequencer.close();
//			        synth.close();
	   }
```


Datei: http://www.java-forum.org/stevg/entchen.mid
Ausgabe: http://www.java-forum.org/stevg/entchen.txt
Und wenn ich das richtig verstanden habe kommst du über folgende Tabellen: http://www.midi.org/about-midi/table1.shtml
an die Noten, Lautstärke, Effekte, etc


----------



## kopfsalat (18. Mai 2005)

MIDI ist ja auch ganz was anderes. Allerdings für diesen Zweck VIIEEL einfacher und zuverlässiger.

Für Audiodaten:

1. Signal Aufnehmen

2. Eine FFT auf die Audiodaten ausführen, die das Zeit/Amplitude-Signal in ein Frequenz/Amplitude-Spektrum umrechnet (in einem festen Zeitfenster)

Bis hierhin scheinst Du es ja schon geschafft zu haben, denn schließlich stehen Dir die Frequenzen des Signals schon zur Verfügung??

3. Die lautesten Frequenzen raussuchen und daraus den Ton berechnen. (Kammerton A ist 440 Hz jeden Halbton höher erhälst du durch jeweils Multiplikation mit Zwölfter Wurzel aus 2 , also 2^(1/12) (ist auch logisch, da 2^(1/12)^12 = 2, also eine Oktave = Frequenzverdopplung.)


----------



## stev.glasow (18. Mai 2005)

> MIDI ist ja auch ganz was anderes.


 Echt? Dat is ja n Ding.

Er hat doch geschrieben das er den Sound vom Keyboard vergleichen will, oder nicht? Und dort über gesampeltem Sound zu gehen halte ich nicht für sinnvoll - MIDI ist für solche Sachen doch viel besser geeignet. Mal davon abgesehn dass ich Punkt 3 nicht verstehe.


----------



## kopfsalat (19. Mai 2005)

proXys erster Satz:


> Also ich hab ein Audiofile das ich irgendwie auswerten soll, ist ...



Aber WENN proXy ein MIDI-Keyboard zur Verfügung hat (hast Du?) ist das natürlich wirklich DIE Lösung.

Zu Punkt 3:
Wenn du dein Audiosignal ins Spektrum übertragen hast, siehst du ja, welche (Sinus-)Frequenzen (in dem fixen Zeitfenster) wie laut vorhanden sind. Je nachdem, wie groß dein Zeitfenster gewählt war, kann man dabei sehr genau werden.
Komplizierte Signale bestehen jedoch aus übelsten Frequenzkombinationen, so dass man da nicht einfach 1 laute Frequenz sieht, und die anderen sind alle leise. Je Sinusförmiger (also 'klarer', 'piepsiger') der Ton ist, desto besser lässt sich dessen Haupt-Frequenz bestimmen.
Auch könnte man nicht nur einzelne Frequenzen betrachten, sondern jeweils die Basisfrequenzen mit ihren Harmonischen, und dann schauen, welche davon die lautesten Kombinationen sind.
Allerdings ist das Ton-Ermitteln aus Audiosignalen, die nicht nur einfach eine einzelne Gitarrenseite o.ä. sind, schwierig bis teilweise unmöglich (ohne vielleicht in 50 Jahren mit neuronalen Netzen, oder sowas, denn schließlich können Menschen ja auch bestehende Musikstücke in Noten niederschreiben).


----------



## proXy (19. Mai 2005)

Oha danke für die vielen antworten ...

@Luma jo les es über die Mikrofonschnittstelle vom PC ein 

@Kopfsalat leider ist das Keyboard nicht MIDI Fähig ist ein älteres und nicht sehr funktionsreiches Keyboard,
                 also zurzeit kann ich die Kurve mit FFT darstellen jedoch muss ich nur noch einen kleinen Fehler 
                 ausbessern. Naja werd mal deine hilfreiche Info ausprobieren danke


----------

