# beliebigen ton erzeugen



## Grimblegrumble2 (20. Mrz 2006)

Hallo,
kann mir jemand sagen wie ich in java einen beliebigen ton ausgeben kann, ich hab mal gegoogelt aber nur das gefunden,  
tinyvm.rcx -->      public static void playTone(int aFrequency,int aDuration)
			Plays a tone, given its frequency and duration.

ich kapier das mit dem tinyvm nich irgendwie is das kein normales packet das man normal einbinden kann, z.B. gibts dann keine garbage collection mehr und lauter so schnick schack, und irgendwie funktionieren dann auch andere sachen nich mehr so wie gewohnt, gibts da nich noch irgendwie ne andere möglichkeit wie man das realisieren kann?

vielen Dank


----------



## André Uhres (20. Mrz 2006)

http://www.jfugue.org/download.jsp

```
import org.jfugue.Player; 
import org.jfugue.Pattern; 
public class Example1 { 
    public static void main(String[] args) { 
        Player player = new Player(); 
        //Thema: 
        Pattern thema = new Pattern("T120 I[Cello] "+ 
                "G3q G3q G3q Eb3q Bb3i G3q Eb3q Bb3i G3h"); 
        player.play(thema); 
        
        //Variation: 
        Pattern cello = new Pattern("T120 I[Cello] G3q G3i G3i Eb3q Bb3i G3q Eb3q Bb3i G3w " + 
                "               G3h     G3i G3i Eb3q Bb3i Ab3q F3q Bb3i Eb3w              G4h " + 
                "C5h+E5h+G5h C5w+Eb5w+G5w    C3w+G4w+E5w+G5w Rh E1i"); 
        Pattern cembalo = new Pattern("I[HARPISCHORD] G4i G4i G4i Eb4q Bb4i G4q Eb4q Bb4i G4q " + 
                "Bb4q Eb4q G4q G4h G4i G4i G4i Eb4q Bb4i Ab4q F4q Bb4i G4q Bb4q Eb4q G4q G5h " + 
                "C5h+E5h+G5h Rhi G4i G4i G4i C4i G4i G4i G4i C5w+E5w+C6w"); 
        Pattern floete = new Pattern("I[FLUTE] G5q C5q Eb5h G5q " + 
                "Bb5q Eb5q G5q G5h Rq Eb5q Ab5q F5w Rq Rh " + 
                "C6w  G6q  C6q G6q C7w E7i C7i  G7s A7s G7s C7q"); 
        Pattern satz = new Pattern(); 
        satz.add("V0 " + cello.getMusicString()); 
        satz.add("V1 " + cembalo.getMusicString()); 
        satz.add("V2 " + floete.getMusicString()); 
        player.play(satz); 
        System.exit(0); 
    } 
}
```


----------



## 0xdeadbeef (20. Mrz 2006)

Grimblegrumble2 hat gesagt.:
			
		

> Hallo,
> kann mir jemand sagen wie ich in java einen beliebigen ton ausgeben kann


Nur mal so 'ne Idee. Wenn Du z.B. eine Sinusschwingung, -rechteck oder Sägezahnschwingung in einen Puffer schreibst und den dann mit einer entsprechenden Frequenz abspielst, kannst Du jede Tohöhe erzeugen.
Und das ganze ohne externe Bibliotheken und mit sehr wenig Code.


----------



## Grimblegrumble2 (21. Mrz 2006)

also das jfuge Ding is schon sehr interessant, aber ziemlich viel code, ich brauch mein prog fürs handy, weiss nich ob das funktioniert, werds mal versuchen,  das mit der Sinus schwingung hört sich nach der Besten lösung an ich weiss aber nich wie das funktionieren soll das ich dem gepufferten sinus dann als frequenz ausgeben kann.


----------



## André Uhres (21. Mrz 2006)

Grimblegrumble2 hat gesagt.:
			
		

> also das jfuge Ding is schon sehr interessant, aber ziemlich viel code..


Zur Orientierung: der distribution folder für das obige Beispiel ist 36KB groß.
JFugue benötigt ausserdem die javax.sound.midi API.


----------



## Roar (21. Mrz 2006)

nen einfachen ton kann man doch auch mti der java sound api abspielen:

```
Synthesizer synth = MidiSystem.getSynthesizer();
					synth.open();
					Receiver rcvr = synth.getReceiver();
					ShortMessage msg = new ShortMessage();
					msg.setMessage(ShortMessage.NOTE_ON, 0, 40, 40);
					rcvr.send(msg, -1);
					Thread.sleep(1500);
					msg.setMessage(ShortMessage.NOTE_OFF, 0, 40, 0);
					rcvr.send(msg, -1);
					synth.close();
```
oder so

edit: 40 == frequenz == ein E


----------



## grimble (28. Mrz 2006)

ich habs mal so kopiert und probiert laufen zu lassen, 

import javax.sound.midi.*;

public class TonTest {

public static void main(String[] args) throws MidiUnavailableException, InvalidMidiDataException, InterruptedException {

    Synthesizer synth = MidiSystem.getSynthesizer(); 
        synth.open(); 
        Receiver rcvr = synth.getReceiver(); 
        ShortMessage msg = new ShortMessage(); 
        msg.setMessage(ShortMessage.NOTE_ON, 0, 40, 40); 
        rcvr.send(msg, -1); 
        Thread.sleep(1500); 
        msg.setMessage(ShortMessage.NOTE_OFF, 0, 40, 0); 
        rcvr.send(msg, -1); 
        synth.close();
	}
}

leider hör ich überhaupt nix.(ist die frequenz vielleicht zu hoch oder zu tief?)  Kann mir jemand sagen was mir fehlt. 
Vielen Dank


----------



## André Uhres (28. Mrz 2006)

ich hör auch nix.. upps mein ton war ja stumm geschaltet..jetzt hör ich was: einen tiefen Klavierton.


----------



## grimble (28. Mrz 2006)

leider leider liegt es bei mir nicht an der lautstärkenregelung, hab alles was man hochschrauben kann hochgeschraubt. 
Hat jemand ne idee woran das sonst noch liegen kann.
Vielen Dank


----------



## grimble (28. Mrz 2006)

ich arbeite auf nem medion laptop kann das sein das es irgendwie daran liegt.
mit ner Realtek AC97 Audio (soundkarte) und bei MIDI Musikwiedergabe ist "Microsoft GS Wavetable SW Synth" eingestellt.
Vielen Dank


----------



## André Uhres (28. Mrz 2006)

grimble hat gesagt.:
			
		

> ich arbeite auf nem medion laptop kann das sein das es irgendwie daran liegt.
> mit ner Realtek AC97 Audio (soundkarte) und bei MIDI Musikwiedergabe ist "Microsoft GS Wavetable SW Synth" eingestellt...


..ich arbeite auf nem XY Desktop mit ichweissnichtwelcher Audiokarte mit irgendwelcher Einstellung..
naja egal..hab da mal was von Javas Plattformunabhängigkeit gehört..


----------



## Gast (10. Okt 2006)

Hy prinzipiell, würd ich nicht nen Ton mit 40Hz zum ausprobieren nehmen, glaub nicht das laptop lausprecher in der lage sind 40 Hz zu übertragen, in der tontechnik wird in der regel ein teston von 1000Hz verwendet. Probier´s vielleicht mal damit!
gruß ralf


----------



## VdA (13. Okt 2006)

Kann ich auch irgendwie die Lautstärke ändern?


----------



## L-ectron-X (13. Okt 2006)

```
msg.setMessage(ShortMessage.NOTE_ON, 5, 70, 90);
```
Wenn du ein bischen mit den Werten herum spielst, erkennst du, dass es der letzte Parameter ist.


----------

