J'ai créé un clone pong et j'aimerais ajouter quelques effets sonores en cas de collision. Mon problème est que chaque exemple que je pourrais trouver sur la synthèse du son prend environ 30 lignes de code, étant donné que mon application entière n'a que 90 lignes de code. Je suis à la recherche d'une approche plus simple. Existe-t-il un moyen simple de créer un bip sonore de différentes tonalités? La durée n'a pas d'importance. Je veux juste une série de bips avec des tons différents.Java générant du son
Répondre
Voici un petit exemple pris (et raccourci) de Java Sound - Example: Code to generate audio tone
byte[] buf = new byte[ 1 ];;
AudioFormat af = new AudioFormat((float)44100, 8, 1, true, false);
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl.open();
sdl.start();
for(int i = 0; i < 1000 * (float)44100/1000; i++) {
double angle = i/((float)44100/440) * 2.0 * Math.PI;
buf[ 0 ] = (byte)(Math.sin(angle) * 100);
sdl.write(buf, 0, 1);
}
sdl.drain();
sdl.stop();
Pouvez-vous expliquer pourquoi vous multipliez par 100 au lieu de 128 dans cette ligne: buf [0] = (octet) (Math.sin (angle) * 100); Je trouve cela très confus, car je soupçonne le signal d'aller entre -127 à 127 ish En outre, le lien est mort. Veuillez le mettre à jour si possible. – Felix
Cela affectera simplement l'amplitude (c'est-à-dire le volume) du son. – while
Quel est le point de 'i <1000 * (float) 44100/1000' n'est pas la même chose que' i <(float) 44100'? – dk14
java.awt.Toolkit.getDefaultToolkit(). Bip()
série de bips?
int numbeeps = 10;
for(int x=0;x<numbeeps;x++)
{
java.awt.Toolkit.getDefaultToolkit().beep();
}
"Différents tons" Il a dit. –
De plus, .beep() ne fonctionne pas sur toutes les plates-formes. –
Vous pouvez utiliser JSyn. C'est une lib que vous devez installer (avec un .DLL
et un .JAR
). Mais très simple pour créer des tons différents.
Link (tutoriels Aussi disponible)
Voici un exemple:
public static void main(String[] args) throws Exception {
SawtoothOscillatorBL osc;
LineOut lineOut;
// Start JSyn synthesizer.
Synth.startEngine(0);
// Create some unit generators.
osc = new SawtoothOscillatorBL();
lineOut = new LineOut();
// Connect oscillator to both left and right channels of output.
osc.output.connect(0, lineOut.input, 0);
osc.output.connect(0, lineOut.input, 1);
// Start the unit generators so they make sound.
osc.start();
lineOut.start();
// Set the frequency of the oscillator to 200 Hz.
osc.frequency.set(200.0);
osc.amplitude.set(0.8);
// Sleep for awhile so we can hear the sound.
Synth.sleepForTicks(400);
// Change the frequency of the oscillator.
osc.frequency.set(300.0);
Synth.sleepForTicks(400);
// Stop units and delete them to reclaim their resources.
osc.stop();
lineOut.stop();
osc.delete();
lineOut.delete();
// Stop JSyn synthesizer.
Synth.stopEngine();
}
Martijn
JSyn est maintenant Java pur et ne nécessite plus de DLL native. – philburk
est ici même code comme ci-dessus avec un peu de la description en 16 bits
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public class MakeSound {
public static void main(String[] args) throws LineUnavailableException {
System.out.println("Make sound");
byte[] buf = new byte[2];
int frequency = 44100; //44100 sample points per 1 second
AudioFormat af = new AudioFormat((float) frequency, 16, 1, true, false);
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl.open();
sdl.start();
int durationMs = 5000;
int numberOfTimesFullSinFuncPerSec = 441; //number of times in 1sec sin function repeats
for (int i = 0; i < durationMs * (float) 44100/1000; i++) { //1000 ms in 1 second
float numberOfSamplesToRepresentFullSin= (float) frequency/numberOfTimesFullSinFuncPerSec;
double angle = i/(numberOfSamplesToRepresentFullSin/ 2.0) * Math.PI; // /divide with 2 since sin goes 0PI to 2PI
short a = (short) (Math.sin(angle) * 32767); //32767 - max value for sample to take (-32767 to 32767)
buf[0] = (byte) (a & 0xFF); //write 8bits ________WWWWWWWW out of 16
buf[1] = (byte) (a >> 8); //write 8bits WWWWWWWW________ out of 16
sdl.write(buf, 0, 2);
}
sdl.drain();
sdl.stop();
}
}
- 1. Instrumentation bytecode générant une erreur java verifier
- 2. Clojure/Java: Bibliothèques Java pour l'analyse spectrale du son?
- 3. Mac Console paste générant du texte poubelle
- 4. son java sans périphérique
- 5. java son de fondu
- 6. Java et Maven générant -et utilisant- mon propre archétype
- 7. générant api en json
- 8. Arbre visuel (graphique) générant
- 9. synchronisation du son
- 10. Outil WSDL.exe générant du code pour .NET Compact Framework
- 11. Rails générant des données JSON avec la racine du modèle
- 12. Auto-Référencement FK générant étrangement
- 13. Suppression Nillable = « true » tout en générant WSDL
- 14. T4MVC ne générant pas d'action
- 15. ASP.Net ScriptMethod générant JSON vide
- 16. Désactiver le son dans Java Applet
- 17. Jouer du son avec OpenAL
- 18. SOX wav lecture du son
- 19. Durée du son dans Flex
- 20. Jouer du son en C++
- 21. Lecture du son en android
- 22. PHP générant XML, time-out au hasard
- 23. Python: Problème rare générant .gif avec ffmpeg
- 24. service web générant problème de proxy
- 25. Problème générant manifeste dans VB.NET 2005
- 26. Code générant des objets proxy du service Web SOAP vous-même - C#/.NET 3.5/T4
- 27. Manipulation du son inverse/lecture du son enregistré sur un iPhone
- 28. asp.net générant l'événement onclick automatiquement pour le bouton
- 29. Java son: quelle est la persistance des contrôles de réglage?
- 30. SQL générant un ensemble de dates
30 lignes de code ne sont pas beaucoup. Quel est le problème avec l'utilisation des exemples que vous avez trouvés? – Joe
ouais je sais mais tout le clone est de 90 lignes. un tiers du code sera utilisé pour créer un bip simple. pour moi un peu inutile mais si je ne trouve pas d'autre moyen, je vais aller avec ça. –
Un quart du code, après le fait. Si cela vous fait sentir mieux ... – Sev