Bergervei/Java-Morsecode

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Java</language>
<code id="4dc26f887f635" hidden>
javax.sound.sampled.AudioFormat audioFormat;
javax.sound.sampled.AudioInputStream audioInputStream;
javax.sound.sampled.SourceDataLine sourceDataLine;
float sampleRate = 16000.0F;
int sampleSizeInBits = 16;
int channels = 1;
boolean signed = true;
boolean bigEndian = true;
audioData = new byte[16000*16];

void fillBuffer(double startat,double freq) {
 java.nio.ByteBuffer byteBuffer;
 java.nio.ShortBuffer shortBuffer;
 int byteLength;
 byteBuffer = java.nio.ByteBuffer.wrap(audioData);
 shortBuffer = byteBuffer.asShortBuffer();
 byteLength = audioData.length;

 channels = 1;//Java allows 1 or 2
 int bytesPerSamp = 2;
 int sampLength = byteLength / bytesPerSamp;
 for (int cnt = 0; cnt < sampLength; cnt++)
 {
  double time = cnt / sampleRate;
  double sinValue = playFunction(startat/2+time,freq);
  shortBuffer.put((short)(16000 * sinValue));
 }
}

void play(double dauer, double startat, double freq){
 dauer = dauer * 2;
 audioData = new byte[16000*dauer];
 try{
 fillBuffer(startat,freq);
 InputStream byteArrayInputStream =  new ByteArrayInputStream(audioData);
 audioFormat = new javax.sound.sampled.AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
 audioInputStream = new javax.sound.sampled.AudioInputStream(byteArrayInputStream, audioFormat,  
                        audioData.length / audioFormat.getFrameSize());
 javax.sound.sampled.DataLine.Info dataLineInfo = 
       new javax.sound.sampled.DataLine.Info(javax.sound.sampled.SourceDataLine.class, audioFormat);
 sourceDataLine = (javax.sound.sampled.SourceDataLine)javax.sound.sampled.AudioSystem.getLine(dataLineInfo);
 sourceDataLine.open(audioFormat);
 sourceDataLine.start();
 playBuffer = new byte[16384];
 int cnt;
 while ((cnt = audioInputStream.read(playBuffer, 0,playBuffer.length))!= -1)
  if (cnt > 0) sourceDataLine.write(playBuffer, 0, cnt);
 sourceDataLine.drain();
 sourceDataLine.stop();
 sourceDataLine.close();
 }
 catch (Exception e){e.printStackTrace();System.exit(0);}
}
</code>

<code id="4dcaef7883931">
public double playFunction(double t, double f) {
 double sinValue = Math.sin(2*Math.PI*f*t);
 return (sinValue);
 }

public void morseAusgabe() {
 String morsetext = JOptionPane.showInputDialog(null, "Gib den Text ein!");
 String morscode = "";
 String morse = "";
 for (int i = 0; i < morsetext.length(); i++) {
  String zeichen = morsetext.substring(i, i+1).toUpperCase();
  switch (zeichen) {
   case "A": morsecode = ".- ";      break;
   case "B": morsecode = "-... ";    break;
   case "C": morsecode = "-.-. ";    break;
   case "D": morsecode = "-.. ";     break;
   case "E": morsecode = ". ";       break;
   case "F": morsecode = "..-. ";    break;
   case "G": morsecode = "--. ";     break;
   case "H": morsecode = ".... ";    break;
   case "I": morsecode = ".. ";      break;
   case "J": morsecode = ".--- ";    break;
   case "K": morsecode = "-.- ";     break;
   case "L": morsecode = ".-.. ";    break;
   case "M": morsecode = "-- ";      break;
   case "N": morsecode = "-. ";      break;
   case "O": morsecode = "--- ";     break;
   case "P": morsecode = ".--. ";    break;
   case "Q": morsecode = "--.- ";    break;
   case "R": morsecode = ".-. ";     break;
   case "S": morsecode = "... ";     break;
   case "T": morsecode = "- ";       break;
   case "U": morsecode = "..- ";     break;
   case "V": morsecode = "...- ";    break;
   case "W": morsecode = ".-- ";     break;
   case "X": morsecode = "-..- ";    break;
   case "Y": morsecode = "-.-- ";    break;
   case "Z": morsecode = "--.. ";    break;
   case "0": morsecode = "----- ";   break;
   case "1": morsecode = ".---- ";   break;
   case "2": morsecode = "..--- ";   break;
   case "3": morsecode = "...-- ";   break;
   case "4": morsecode = "....- ";   break;
   case "5": morsecode = "..... ";   break;
   case "6": morsecode = "-.... ";   break;
   case "7": morsecode = "--... ";   break;
   case "8": morsecode = "---.. ";   break;
   case "9": morsecode = "----. ";   break;
   case "Ä": morsecode = ".-.- ";    break;
   case "Ö": morsecode = "---. ";    break;
   case "Ü": morsecode = "..-- ";    break;
   case "ß": morsecode = "...--.. "; break;
   case ".": morsecode = ".-.-.- ";  break;
   case ":": morsecode = "---... ";  break;
   case ",": morsecode = "--..-- ";  break;
   case ";": morsecode = "-.-.-. ";  break;
   case "?": morsecode = "..--.. ";  break;
   case "-": morsecode = "-....- ";  break;
   case "_": morsecode = "..--.- ";  break;
   case "(": morsecode = "-.--. ";   break;
   case ")": morsecode = "-.--.- ";  break;
   case "'": morsecode = ".----. ";  break;
   case "=": morsecode = "-...- ";   break;
   case "+": morsecode = ".-.-. ";   break;
   case "/": morsecode = "-..-. ";   break;
   case "@": morsecode = ".--.-. ";  break;
   case " ": morsecode = "/ ";       break;
   default:
    morsecode = "? ";
  }
  System.out.print(morsecode);
  morse = morse + morsecode;
 }
 canvas.clear();
 int posx = 0;
 int posy = 20;
 for (int i = 0; i < morse.length(); i++) {
  String zeichen = morse.substring(i, i+1);
  switch (zeichen) {
   case ".": 
    play(0.2, 0, 1000); 
    if (posx + 10 > 800) {
     posx = 0; posy = posy + 30;
    }
    canvas.fillRect(posx, posy, 10, 10);           
    posx = posx + 20;
    break;
   case "-": 
    play(0.6, 0, 1000);
    if (posx + 30 > 800) {
     posx = 0; posy = posy + 30;
    }
    canvas.fillRect(posx, posy, 30, 10);           
    posx = posx + 40;
    break;
   case " ":
    play(0.4, 0, 0);
    posx = posx + 20;
    break;
   default: 
    play(0.8, 0, 440); 
    posx = posx + 10;
  }
 }
}
</code>

<canvas w="800" h="200"></canvas>

<run id="4dcaea0c4ceef">
morseAusgabe();
</run>