1 package com.jamesbryangraves.bob.music; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Composer extends Thread { 7 8 private List<MusicEventListener> listeners = new ArrayList<MusicEventListener>(); 9 private MusicContext musicContext; 10 private List<MusicEventGenerator> musicGenerators; 11 private long tick = 0; 12 private boolean open; 13 14 public void run() { 15 16 try { 17 while(isOpen()) { 18 compose(); 19 } 20 } catch(Exception e) { 21 e.printStackTrace(); 22 System.exit(1); 23 } 24 } 25 26 public void compose() throws Exception { 27 for(int i = 0; i < musicGenerators.size(); i++) { 28 MusicEventGenerator musicGenerator = musicGenerators.get(i); 29 for(MusicEvent event : new Phrase() 30 .generateEvents(musicGenerator, musicContext, tick)) { 31 notifyMusicEventListeners(i, event); 32 } 33 34 } 35 tick += musicContext.getTicksPerBar() * musicContext.getPhraseSize(); 36 } 37 38 public void notifyMusicEventListeners(int index, MusicEvent event) { 39 for(MusicEventListener listener : listeners) 40 listener.handleMusicEvent(index, event); 41 } 42 43 public MusicContext getMusicContext() { 44 return musicContext; 45 } 46 47 public void setMusicContext(MusicContext musicContext) { 48 this.musicContext = musicContext; 49 } 50 51 public List<MusicEventGenerator> getMusicGenerators() { 52 return musicGenerators; 53 } 54 55 public void setMusicGenerators(List<MusicEventGenerator> musicGenerators) { 56 this.musicGenerators = musicGenerators; 57 } 58 59 public long getTick() { 60 return tick; 61 } 62 63 public void setTick(long tick) { 64 this.tick = tick; 65 } 66 67 public List<MusicEventListener> getListeners() { 68 return listeners; 69 } 70 71 public void setListeners(List<MusicEventListener> listeners) { 72 this.listeners = listeners; 73 } 74 75 public boolean isOpen() { 76 return open; 77 } 78 79 public void open() { 80 this.open = true; 81 } 82 83 public void close() { 84 this.open = false; 85 } 86 87 }