/** * Perifériák és multimédia eszközök - Morse program. * 6. feladat - Morse kódolás * * A program PUBLIC DOMAIN. A beadás után a forráskód nyilvánosan elérhetővé * válik a potvizs.ga és a gotvizs.ga weboldalakról. A Public Domain licensz * a program könyvtárában megtalálható a LICENSE.TXT fájlban. * * @author Tóth Patrik (aryx, ZLIMO5) <[email protected]> * @version 1.0 */ package morse; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; /** * * @author aryx */ public class Morse { static int byteCount = 0; // kimenő wav fájl beállítása static float freq; static int sRate = 44100; static int bitDepth = 16; static int nChannels = 1; static float dur; static float changeRate; /** * * Főfüggvény * * @author aryx, jaket * @param args A program paraméterei */ { if (args.length == 0) { return; } if (args[0].equals("--help")) { return; } if (args.length == 1 || args.length == 2) { return; } freq = 990; // Hz changeRate = (float)((2.0 * Math.PI * freq) / sRate); // szinuszjel alapját adó szám (ciklusban lesz növelve) //message = message.replace("-", " "); filePath = file.getAbsolutePath(); // Fájl megnyitása, RIFF header kiírása // A kód eredete: https://stackoverflow.com/questions/40209335/how-to-generate-a-wav-file-with-a-sinusoidal-wave-and-user-defined-duration-and try { raw.setLength(0); // Set file length to 0, to prevent unexpected behavior in case the file already existed raw.writeBytes("RIFF"); raw.writeInt(0); // Final file size not known yet, write 0. This is = sample count + 36 bytes from header. raw.writeBytes("WAVE"); raw.writeBytes("fmt "); raw.writeShort(Short.reverseBytes((short)nChannels));// Number of channels, 1 for mono, 2 for stereo raw.writeInt(Integer.reverseBytes(sRate*bitDepth*nChannels/8)); // Byte rate, SampleRate*NumberOfChannels*bitDepth/8 raw.writeShort(Short.reverseBytes((short)(nChannels*bitDepth/8))); // Block align, NumberOfChannels*bitDepth/8 raw.writeBytes("data"); raw.writeInt(0); // Data chunk size not known yet, write 0. This is = sample count. } { } generateMorse(message, sRate, dur, changeRate); closeFile(); } /** * * Kiírja a nyitott WAV fájlba a megadott üzenetet morse kódolással * * @author aryx * @param String message Az átalakítandó üzenet szövege * @param int sRate Mintavételezési frekvencia * @param float dur Egy egység hossza másodpercben * @param float changeRate Szinuszjel amplitúdója */ // karakterenként végiglépünk az üzeneten message = message.toLowerCase(); for (char ch: message.toCharArray()) { getMorseCode(ch, sRate, dur, changeRate); writeCode(sRate, dur, 0, 3); // 3 egység szünet a betűk között } } /** * * Adott karaktert, szünetet ír a nyitott WAV fájlba morse kódolással * * @author aryx * @param char character Az átalakítandó karakter * @param int sRate Mintavételezési frekvencia * @param float dur Egy egység hossza másodpercben * @param float changeRate Szinuszjel amplitúdója */ static void getMorseCode(char character, int sRate, float dur, float changeRate) { // TODO: tömbben tárolni a karaktereket kódját és abból kiolvasni switch (character) { case ' ': writeCode(sRate, dur, 0, 7); break; case 'a': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case 'b': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case 'c': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; case 'd': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case 'e': writeCode(sRate, dur, changeRate, 1); break; case 'f': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; case 'g': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; case 'h': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case 'i': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case 'j': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case 'k': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case 'l': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case 'm': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case 'n': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; case 'o': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case 'p': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; case 'q': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case 'r': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; case 's': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case 't': writeCode(sRate, dur, changeRate, 3); break; case 'u': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case 'v': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case 'w': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case 'x': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case 'y': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case 'z': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case '0': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case '1': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case '2': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case '3': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); break; case '4': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 3); break; case '5': writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case '6': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case '7': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case '8': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); writeCode(sRate, dur, changeRate, 1); break; case '9': writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 3); writeCode(sRate, dur, changeRate, 1); break; } } /** * * Adott hosszú és amplitúdójú szinuszjelet ír a megadott mintavételezési * frekvenciával a nyitott WAV fájlba. A morsekód hossza (egység) itt * adható meg. * * @author aryx * @param int sRate Mintavételezési frekvencia * @param float dur Egy egység hossza másodpercben * @param float changeRate Szinuszjel amplitúdója * @param int length Morse kód hossza egységben */ static void writeCode(int sRate, float dur, float changeRate, int length) { for (int i = 0; i < sRate*dur*length; i++) { } for (int i = 0; i < sRate*dur; i++) { writeSample(0); } } /** * * Egy minta írása a nyitott WAV fileba. * * @author aryx * @param float floatValue A minta értéke */ static void writeSample(float floatValue) { try { char shortSample = (char)( (floatValue)*0x7FFF ); byteCount += 2; } { } } /** * * Bezárja a korábban nyitott WAV fájlt. * * @author aryx */ static void closeFile() { try { raw.seek(4); // Write size to RIFF header raw.seek(40); // Write size to Subchunk2Size field raw.close(); } { } } }