Audio tap

Audio tap



1.  UVOD

Sastavni dio kolegija "Asistivna tehnologija" je i projekt u kojem studenti rade na razvoju raznih uređaja namijenjenih primarno osobama s invaliditetom, koristeći različit softver i hardver. Ovaj projekt koristi Java programski jezik u NetBeans razvojnom okruženju te mali midi kontroler Oxygen 25. Time je izvedena aplikacija koja pruža mogućnost sviranja melodije na određenu pjesmu (pomoću midi kontrolera). Osobe sa invaliditetom koje nemaju mogućnost rukama svirati neki instrument (primjerice klavir), ali imaju dovoljno snage i sposobnosti da stisnu botune srednje veličine, s ovom aplikacijom mogu barem donekle imati zadovoljstvo sviranja uz glazbu.

U ovoj projektnoj dokumentaciji je prikazana početna ideja, navedena sva korištena oprema, objašnjeno je korištenje aplikacije i uređaja te su ukratko razložene neke općenite informacije.

 

2. O APLIKACIJI

Aplikacija je namijenjena primarno osobama koje imaju poteškoća sa motorikom te osobama koje nisu u mogućnosti pritisnuti više tipki/botuna istovremeno, ali ipak imaju dovoljno sposobnosti da pritisnu određeni botun. Naravno, mogu je koristiti i svi ostali, a posebice djeca. Svrha je jednostavna; zabava!

Početna ideja aplikacije je bila vezana za korištenje neke vrste switch uređaja sa više botuna (primjer na slici 1), koji bi služio istoj svrsi kao što sada služe botuni na midi kontroleru. No zbog lakšeg pristupa MIDI kontroleru, početna ideja je izmijenjena pošto su ionako potrebne manje prilagodbe kako bi aplikacija funkcionirala sa bilo kojim switch uređajem ili sličnom napravom sa ugrađenim botunima.

 

114.png

Slika 1. Vrsta switch uređaja
 

Sama funkcija aplikacije je sljedeća: korisnik pritiskom na prvi botun pokreće odnosno zaustavlja pjesmu. U trenutnoj verziji, pjesma je samo jedna, no to je vrlo jednostavno proširiti; dodavanjem novih pjesama i zanemarivom izmjenom koda aplikacije. Druga dva botuna se koriste za sviranje glavne melodije - jedan namijenjen za više tonove, a drugi za niže. Svi tonovi koje je moguće generirati pritiskom na botun su prilagođeni na način da odgovaraju ključu pjesme, pa na tako neće biti odsvirane note koje "ne idu uz pjesmu".

 

3. MIDI KONTROLER

Za potrebe projekta, korišten je midi kontroler "M-AUDIO Oxygen 25 MK IV" (slika 2). Generalno, MIDI kontroleri ne proizvode zvuk, nego samo daju informaciju o promjeni položaja neke tipke, botuna, potenciometra i slično. Iz tog razloga nije moguće samo uključiti ovaj uređaj i svirati, nego treba postojati program koji će znati što napraviti s informacijom koju primi od uređaja. U svrhu ove aplikacije korišteno samo prva tri botuna u gornjem desnom kutu kontrolera (slika 3), kao zamjena za switch uređaj koji je u prvotnoj ideji trebao biti korišten.

 

115.jpg

Slika 2. M-AUDIO Oxygen 25 MK IV

 

U projektu su postavljene sljedeće kontrole:

  • botun 1 pokreće i zaustavlja pjesmu
  • botun 2 generira tonove u ključu pjesme viših frekvencija (više tonove)
  • botun 3 generira tonove u ključu pjesme nižih frekvencija (dublje tonove)

 

4. JAVA OPĆENITO

Za svrhu ovog projekta, aplikacija je razvijena u programskom jeziku Java. Java je objektno orijentirani programski jezik. Razvoj su 1991. godine započeli James Gosling, Patrick Naughton i ostali inženjeri u tvrtci Sun Microsystems (koju je kasnije preuzela Oracle korporacija). Od 2016. godine, Java je jedan od najpopularnijih programskih jezika koji se koriste, ponajviše zbog klijent- server web aplikacija.

Ovaj programski jezik je posebno dizajniran kako bi imao što manje provedbenih. Namjera je bila omogućiti programerima da se aplikacija "napiše jednom, i pokrene bilo gdje" (write once, run anywhere - WORA), što znači da je kompajlirani Java kod bilo moguće izvoditi na svim platformama koje podržavaju Java programski jezik bez potrebe za ponovnim kompajliranjem. Java aplikaije su obično kompajlirane na bytecode razini, što je moguće izvoditi na bilo kojem Java virtualnom stroju (Java Virtual Machine - JVM) neovisno o arhitekturi računala. Jezik vuče veliki dio svoje sintakse od C i C ++ programskih jezika, ali ima manje objekata niske razine nego bilo koji od njih.

 

5. TEHNIČKI DIO

Aplikacija je pisana u programskom jeziku Java u NetBeans razvojnom okruženju što osigurava njezinu neovisnost o platformi. Aplikacija se sastoji od četiri klase: mainFrame, MidiHandler, MidiInputReceiver i AudioClick. Klasa mainFrame je glavna klasa koja sadrži main metodu. Klasa mainFrame opisuje grafičko sučelje aplikacije koje se sastoji od tri gumba. Izvođenje glazbe se može vršiti korištenjem MIDI tipkovnice ili pritiskom miša na jedan od tri gumba.

Gornji gumb se koristi za reprodukciju pozadinske glazbe. Da bi se to osiguralo pritiskom na gumb ili na određenu tipku MIDI tipkovnice poziva se metoda playBackgroundAudio koja pokreće dretvu u pozadini. Dretva je potrebna da se rad aplikacije ne bi prekinuo za vrijeme reprodukcije pozadinske glazbe jer se ona ne bi mogla ponavljati. Pozivanjem te metode, osim reprodukcije, može se i zasutaviti izvođenje pozadinske glazbe. Metoda playBackgroundAudio izgleda ovako:

 

public static void playBackgroundAudio(){ 
     try {
          if(backAudio){ 
              clip.stop();
              t1.stop(); 
              backAudio=false;
          }else{
              t1= new Thread(r1); t1.start(); backAudio=true;
          } 
     }
     catch(Exception e){ 
          System.out.println("Exception:  "+e);
}

 

Dretva u svojem radu dobavlja potrebne resurse, tj. pozadinsku glazbu. Izvršavanje dretve se odvija konstantno od njezinog pokretanja do njezinog zaustavljanja. To omogućuje konstantno ponavljanje reprodukcije pozadinske glazbe. Kod dretve je slijedeći:

 

static Runnable r1 = new Runnable() { 
public void run() {
     try{
          AudioInputStream file = AudioSystem.getAudioInputStream(getClass().getClassLoader().getResource("sounds/BGsong1.wav")); clip  =  AudioClick.getBackgroundAudioClip(file);
          while(true){ 
               clip.loop(1); 
               Thread.sleep(1020);
          }
    }
    catch(Exception e){}
    }
};

 

Pritiskom miša ili određene tipke na MIDI tipkovnici reproducira se nasumično odabrani zvuk iz određene skupine korištenjem metode playAudio. Svaki gumb ima svoju skupinu tonova. Nasumičnost izvođenja zvuka se osigurava korištenjem matematičke metode random iz Java knjižnice. Metoda playAudio je sljedeća:

 

public static void playAudio(int i){ 
     try{
          int  broj=(int)(Math.random()*8)+1; AudioInputStream file =
          AudioSystem.getAudioInputStream(mainFrame.class.getClassLoader().getResource("sounds/"+i+""+broj+". wav"));
          AudioClick.playSound(file);
     }
     catch(Exception e){ 
          System.out.println("Exception:  "+e);
     }
}

 

Klasa MidiHandler se inicijalizira prilikom pokretanja aplikacije, te se izvršava tijekom cijelog rada aplikacije. Ona se brine o otkrivanju priključenih MIDI tipkovnica te o osluškivanju kanala na otkrivenim tipkovnicama. Kada se primjeti neki događaj na tipkovnici kreira se novi objekt klase MidiInputReceiver koji dobiva kao parametre naziv priključene tipkovince i poruku tipa byte koja sadrži podatke o statusu i pritisnutoj tipci. Za otkrivanje pritisnute tipke dovoljna su prva dva byte-a poruke. Na temelju ta dva byte-a pokreće se metoda playAudio ili playBackgroundAudio iz klase mainFrame. Kodovi ovih dviju klasi su:

 

public class MidiHandler{
     public MidiHandler()
     {
          MidiDevice device;
          MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); 
          for (int i = 0; i < infos.length; i++) {
               try {
                    device  =  MidiSystem.getMidiDevice(infos[i]); 
                    System.out.println(infos[i]);

                    List<Transmitter> transmitters = device.getTransmitters(); 
                    for(int j = 0; j<transmitters.size();j++) { 
                         transmitters.get(j).setReceiver( new   MidiInputReceiver(device.getDeviceInfo().toString()));
                    }
                    Transmitter trans = device.getTransmitter();
                    trans.setReceiver(new    MidiInputReceiver(device.getDeviceInfo().toString())); 
                    device.open();
                    System.out.println(device.getDeviceInfo()+"  Was  Opened");
               } catch (MidiUnavailableException e) {}
          }

     }

     public class MidiInputReceiver implements Receiver { public String name;

     public MidiInputReceiver(String name) { this.name = name;
     }

     public void send(MidiMessage msg, long timeStamp) { byte[] msgByte = msg.getMessage(); 
          if(msgByte[0]==-119 && msgByte[1]==36){ mainFrame.playBackgroundAudio();
          }
          else if(msgByte[0]==-119 && msgByte[1]==38){ mainFrame.playAudio(1);
          }
          else if(msgByte[0]==-119 && msgByte[1]==42){ mainFrame.playAudio2(2); System.out.println("midi3");
          }

     public void close() {}
     }
}

 

Klasa AudioClick se sastoji od dviju metoda: playSound i getBackgroundAudioClip. Te dvije metode se pozivaju na izvršavanje unutar metoda iz mainFrame klase i služe prvenstveno za dobavljanje zvukovnog klipa. Razlika između tih dviju metoda je prvenstveno u tome što playSound metoda uz dobavljanje klipa izvrši i njegovu reprodukciju. Izgled ove klase je slijedeći:

 

public class AudioClick {
     public static void playSound(AudioInputStream file){ 
     try{
          Clip clip = AudioSystem.getClip(); clip.open(file);
          clip.start();
     }
     catch(Exception e){}
     }
     public static Clip getBackgroundAudioClip(AudioInputStream file){ 
     try{
          Clip clip = AudioSystem.getClip(); clip.open(file);
          return clip;
     }
     catch(Exception e){} return null;
     }
}

 

4. ZAKLJUČAK

Ova jednostavna aplikacija ima puno prostora za nadogradnju, no za primjene u vidu osoba s invaliditetom, vrlo često je jednostavnost najvažnija. Eventualno moguća korisna nadogradnja bi bila dodavanje više pozadinskih pjesama te ugraditi mogućnost izbora pjesme pomoću još jednog gumba.

 


David Dominić, Matko Margan