import javax.sound.midi.*; import java.io.*; import java.util.*; /** * Programm loeb etteantud tekstifailist * andmed ning mängib ette või koostab MIDI-faili. * Andmed antakse ette astmenimede esitähtedena. * j=jo jne. Tähe taga olev number tähistab * kestust. Numbri puudumisel on tegemist veerandnoodiga * 1 tähendab tervet nooti, 2 poolnooti, 8 * kaheksandiknooti ning 6 kuueteistkümnendiknooti. * # ja b on kõrgendus- ja madaldusmärk. * Noodi järel lisatud ülakoma' näitab noodi * kuulumist kõrgemasse oktaavi, koma, aga madalamasse * oktaavi. * Jo asukohta saab määrata kirjutades rea algusse näiteks * jo=C , mis tähendab kindlaksmääratud kõrgust * jo=60 on sama MIDI numbrina * jo=+2 tähendab loo kõrgendamist terve tooni * ehk kahe pooltooni võrra, * jo=-1 aga madaldamist ühe pooltooni jagu. * Kommentaariks loetakse real asuvast semikoolonist * edasi asetsev tekst. */ public class Noodilugeja1{ static Sequence sekvents; static Track rada; static int tiks=0; static int toonika=60; static int valjus=90; static int pill=16; static int[] noodivahed={0, 2, 4, 5, 7, 9, 11}; //Kaugused toonikast pooltoonides static char[] tahised={'j','l','m','n','s','r','d'}; //jo, le, mi, na, so, ra, di static int[] noodipikkused={16, 8, 4, 2, 1}; //Noodi pikkus tiksudes static int[] pikkustahised={'1', '2', '4', '8', '6'}; //Pikkusele vastav sümbol static int[] tahtnimetused={'c', 'd', 'e','f','g','a','h'}; static void alusta() throws InvalidMidiDataException{ sekvents=new Sequence(Sequence.PPQ, 4); sekvents.createTrack(); //algusesse tühi rada rada=sekvents.createTrack(); ShortMessage algus=new ShortMessage(); algus.setMessage(ShortMessage.PROGRAM_CHANGE, 0, pill,0); rada.add(new MidiEvent(algus, 0)); } static void lisaNoot(String s) throws InvalidMidiDataException{ int pikkus=4; int nihe=-1; //kaugus toonikast. boolean paus=true; int koht=0; //Mitmenda sümbolini ollakse analüüsil jõutud for(int i=0; ikoht){ char tahis=s.charAt(koht); for(int i=0; ikoht){ if(s.charAt(koht)=='.'){ pikkus=pikkus+pikkus/2; koht++; } } //Kõrgendus/madaldus if(s.length()>koht){ if(!paus){ char tahis=s.charAt(koht); if(tahis=='#'){ nihe++; koht++; } if(tahis=='b'){ nihe--; koht++; } } } //Nihe oktaavides while(s.length()>koht){ char tahis=s.charAt(koht); if(tahis=='\''){nihe+=12;} //oktaav üles if(tahis==','){nihe-=12; } //oktaav alla koht++; } int korgus=toonika+nihe; if(!paus){ ShortMessage lahti=new ShortMessage(); lahti.setMessage(ShortMessage.NOTE_ON, 0, korgus, valjus); rada.add(new MidiEvent(lahti, tiks)); } tiks+=pikkus; if(!paus){ ShortMessage kinni=new ShortMessage(); kinni.setMessage(ShortMessage.NOTE_OFF, 0, korgus, valjus); rada.add(new MidiEvent(kinni, tiks)); } } static void muudaJo(String s){ int muutus=-1; for(int i=0; i=0){rida=rida.substring(0, rida.indexOf(";"));} rida=rida.toLowerCase(); if(rida.length()>3 && rida.startsWith("jo=")){ muudaJo(rida.substring(3)); continue; } StringTokenizer stk=new StringTokenizer(rida); while(stk.hasMoreTokens()){ lisaNoot(stk.nextToken()); } } sisse.close(); } static void trykiFail(String failinimi) throws IOException{ MidiSystem.write(sekvents, 1, new FileOutputStream(failinimi)); } static void mangi() throws Exception{ Sequencer sekventser=MidiSystem.getSequencer(); sekventser.open(); sekventser.setSequence(sekvents); sekventser.start(); } public static void main(String argumendid[]) throws Exception{ if(argumendid.length==0){ System.out.println("Kasuta kujul "); System.out.println("java Noodilugeja1 sisendfail.txt [valjundfail.mid]"); return; } alusta(); loeFail(argumendid[0]); if(argumendid.length>1){trykiFail(argumendid[1]);} else {mangi();} } }