Ton beim abfragen einer Vokabel

Hallo,
ich hab einen kleinen Trainer geschrieben. Jetzt ist es bei Vokabeln so, d. wenn sie richtig sind, sollte ein grüner Haken und schönes Geräusch kommen, wenn sie falsch sind, sollte etwas rotes und ein unschönes Geräusch kommen. Lernpsychologisch ist das logisch. Also hab ich nach java beep tone gesucht, was es alles so gibt, und von dieser Seite „geklaut“:

        byte[] buf = new byte[1];
        AudioFormat af
                = new AudioFormat(
                        8000f,  // sampleRate
                        8,      // sampleSizeInBits
                        1,      // channels
                        true,   // signed
                        false); // bigEndian
        SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
        sdl.open(af);
        sdl.start();
        for (int i = 0; i < msecs * 8; i++) {
            double angle = i / (8000f / hz) * 2.0 * Math.PI;
            buf[0] = (byte) (Math.sin(angle) * 127.0 * vol);
            sdl.write(buf, 0, 1);
        }
        sdl.drain();
        sdl.stop();
        sdl.close();
    }```

audio - How to play a sound (alert) in a java application? - Stack Overflow , 10.10. 15

Mit dem folgenden Anwendungsfall:

            tone(1600, 100, 1.0);
            tone(1800, 100, 1.0);
            tone(2000, 100, 1.0);
            JOptionPane.showMessageDialog(null, prozent + "
" + v.getVersuch() + "
" + frage[0] + "
" + frage[1] + "
" + s, "!!! RICHTIG !!!", JOptionPane.INFORMATION_MESSAGE);
        } else {
            tone(2000, 100, 1.0);
            tone(1800, 100, 1.0);
            tone(1600, 100, 1.0);
            JOptionPane.showMessageDialog(null, prozent + "
" + v.getVersuch() + "
" + frage[0] + "
" + frage[1] + "
" + s, "!!! FALSCH !!!", JOptionPane.WARNING_MESSAGE);
        }```

D. heißt, wenn eine Vokabel richtig ist, **steigt der Ton an**. Wenn eine Vokabel falsch ist, **sinkt der Ton ab**. Meine Frage wäre jetzt, 1.) ob es vielleicht einen besseren Ton/Geräusch gibt/kennt, und 2.) ob der Ton für den Benutzer/User (al. mich) mit dem, was oben steht, nicht zu nervig / lang / hoch / tief ist?

Danke für eure erklärung

Cyborg

Aus einem **alten **Spiel von mir (könnte man sicher eleganter schreiben):

import java.io.*;

import javax.sound.sampled.*;

class AudioProvider{

   public static AudioProvider INSTANCE = new AudioProvider();
   public final static int MOVE = 0;
   public final static int BOING = 1;
   public final static int WIN = 2;

   private Clip[] clips = new Clip[3];
   private int running = 0;
   private boolean mute = false;

   private AudioProvider()
   {
      clips[MOVE]  = loadSound("move.wav");
      clips[BOING] = loadSound("boing.wav");
      clips[WIN] = loadSound("win.wav");
   }

   public Clip loadSound(String name)
   {
       File file = new File("./res/" + name);
       AudioInputStream ais = null;
       Clip clip = null;
       try
       {
          ais = AudioSystem.getAudioInputStream(file);

          AudioFormat format = ais.getFormat();

          if ((format.getEncoding() == AudioFormat.Encoding.ULAW) ||
              (format.getEncoding() == AudioFormat.Encoding.ALAW))
          {
              AudioFormat tmp = new AudioFormat(
                                        AudioFormat.Encoding.PCM_SIGNED,
                                        format.getSampleRate(),
                                        format.getSampleSizeInBits() * 2,
                                        format.getChannels(),
                                        format.getFrameSize() * 2,
                                        format.getFrameRate(),
                                        true);
              ais = AudioSystem.getAudioInputStream(tmp, ais);
              format = tmp;
          }


          DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat(),
                 ((int) ais.getFrameLength() * format.getFrameSize()));

          clip = (Clip) AudioSystem.getLine(info);
          clip.open(ais);
       }
       catch(Exception e) { e.printStackTrace(); }

       return clip;
   }


   public void playSound(int type)
   {
      if(mute) return;
      Clip clip = clips[type];

      clips[running].stop();
      clips[running].flush();
      clips[running].setMicrosecondPosition(0);
      running = type;

      clip.start();
   }

   public void setMute(boolean mute)
   {
      this.mute = mute;
   }
}

Wie du dir denken kannst, stehen im res-Verzeichnis die drei gennannten Sounds als wav-Dateien.

Du könntest nicht der drei Sounds ähnliche Sounds mit AudioFormat wie oben beschrieben herstellen oder? Kaskadierend klänge gut. Ich wollte ja auch nicht, d. das klassisch konditioniert wurde.

Warum sollte man die Sounds selbst machen? Scheint mir bei einem Vokabelprogramm Overkill zu sein, gibt doch schon hunderttausende freier Soundschnipsel für sowas, und du bist viel flexibler.

Nun ja, bis jetzt ist das .jar ohne die gson libs nur 15 kB groß. Nehme ich Sounds/WAVs dazu, wird das schnell größer. OK, vielleicht ist das bei 500gb vernachlässigbar. Mit der “Levenshtein Distanz”,
ist das allerdings genial. Danke für deinen Tipp.

Edit: Das hört sich so ganz gut an:

        float hz = 400f;
        byte[] buf = new byte[1];
        AudioFormat af
                = new AudioFormat(
                        8000f, // sampleRate
                        8, // sampleSizeInBits
                        1, // channels
                        true, // signed
                        false); // bigEndian
        SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
        sdl.open(af);
        sdl.start();
        for (int i = 0; i < 800; i++) {
            double angle = i / (8000f / (hz += 0.25f)) * 2.0 * Math.PI;
            buf[0] = (byte) (Math.sin(angle) * 127.0 * 1.0);
            sdl.write(buf, 0, 1);
        }
        for (int i = 0; i < 800; i++) {
            double angle = i / (8000f / (hz += 0.25f)) * 2.0 * Math.PI;
            buf[0] = (byte) (Math.sin(angle) * 127.0 * 1.0);
            sdl.write(buf, 0, 1);
        }
        for (int i = 0; i < 800; i++) {
            double angle = i / (8000f / (hz += 0.25f)) * 2.0 * Math.PI;
            buf[0] = (byte) (Math.sin(angle) * 127.0 * 1.0);
            sdl.write(buf, 0, 1);
        }
        for (int i = 0; i < 800; i++) {
            double angle = i / (8000f / (hz += 0.25f)) * 2.0 * Math.PI;
            buf[0] = (byte) (Math.sin(angle) * 127.0 * 1.0);
            sdl.write(buf, 0, 1);
        }
        sdl.drain();
        sdl.stop();
        sdl.close();
    }```

auf Linux funkt's nicht.

[QUOTE=CyborgBeta]
auf Linux funkt’s nicht.[/QUOTE]
Hast du bei dem Linux-System den Sound aktiviert? Bzw die Lautstärke nicht zu leise? Boxen angeschlossen?
Weil ohne eine Soundausgabe kann man nix hören.

Ansonsten habe ich mal schnell dieses Suchwebseite im Internetgenommen und kam da noch zu diesem Ergebniss, vielleicht hilft es dir
How can I make my Java application with audio play nice in Linux? - Stack Overflow

Falls du wissen willst, wie ich diese geniale Suchseite verwendet habe, ich habe die Parameter AudioSystem java Linux verwendet und der 2te Eintrag war von der Überschrifft her passend zu der Frage die du hast.

Die Lautstärke ist bei mir immer voll aufgedreht. :S Ne, nicht ernsthaft gemeint. Ich weiß nicht, wieso es unter Linux nicht funkt.
Danke für die durch Google gefundene Seite.

Noch etwas, nimmt man an, eine Vokabel ist zu Beginn 50 % richtig oder 100 %? Für eine richtige Vokabel kann 1 gesammelt werden,
für eine falsche Vokabel kann 0,5 gesammelt werden.

Hätte ja sein können, das du einen anderen PC zum testen der Linux-Version hast und dort der Ton aus ist. Manchmal sind es schließlich die Simplen Dinge, die es kompliziert machen :wink:

Hat der Link geholfen, bzw die dort weiterführenden Informationen? Ansonsten gab es noch weitere passende Seiten bei der Googlesuche, die man sich anschauen kann. Habe selber noch nix mit Ton unter Linux probiert (bisher nur auf Windoof und da scheint es ja bei dir auch zu klappen)

Deine neue Frage, verstehe ich leider nicht, was willst du Wissen mit Vokabeln und halb richtig von beginn?