1 /* 2 * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Sun designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Sun in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 22 * CA 95054 USA or visit www.sun.com if you need additional information or 23 * have any questions. 24 */ 25 package com.sun.media.sound; 26 27 import java.io.IOException; 28 import javax.sound.midi.Instrument; 29 import javax.sound.midi.MidiChannel; 30 import javax.sound.midi.Patch; 31 import javax.sound.midi.Soundbank; 32 import javax.sound.midi.SoundbankResource; 33 import javax.sound.midi.VoiceStatus; 34 35 /** 36 * A abstract class used to simplify creating custom ModelOscillator. 37 * 38 * @author Karl Helgason 39 */ 40 public abstract class ModelAbstractOscillator 41 implements ModelOscillator, ModelOscillatorStream, Soundbank { 42 43 protected float pitch = 6000; 44 protected float samplerate; 45 protected MidiChannel channel; 46 protected VoiceStatus voice; 47 protected int noteNumber; 48 protected int velocity; 49 protected boolean on = false; 50 init()51 public void init() { 52 } 53 close()54 public void close() throws IOException { 55 } 56 noteOff(int velocity)57 public void noteOff(int velocity) { 58 on = false; 59 } 60 noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, int velocity)61 public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, 62 int velocity) { 63 this.channel = channel; 64 this.voice = voice; 65 this.noteNumber = noteNumber; 66 this.velocity = velocity; 67 on = true; 68 } 69 read(float[][] buffer, int offset, int len)70 public int read(float[][] buffer, int offset, int len) throws IOException { 71 return -1; 72 } 73 getChannel()74 public MidiChannel getChannel() { 75 return channel; 76 } 77 getVoice()78 public VoiceStatus getVoice() { 79 return voice; 80 } 81 getNoteNumber()82 public int getNoteNumber() { 83 return noteNumber; 84 } 85 getVelocity()86 public int getVelocity() { 87 return velocity; 88 } 89 isOn()90 public boolean isOn() { 91 return on; 92 } 93 setPitch(float pitch)94 public void setPitch(float pitch) { 95 this.pitch = pitch; 96 } 97 getPitch()98 public float getPitch() { 99 return pitch; 100 } 101 setSampleRate(float samplerate)102 public void setSampleRate(float samplerate) { 103 this.samplerate = samplerate; 104 } 105 getSampleRate()106 public float getSampleRate() { 107 return samplerate; 108 } 109 getAttenuation()110 public float getAttenuation() { 111 return 0; 112 } 113 getChannels()114 public int getChannels() { 115 return 1; 116 } 117 getName()118 public String getName() { 119 return getClass().getName(); 120 } 121 getPatch()122 public Patch getPatch() { 123 return new Patch(0, 0); 124 } 125 open(float samplerate)126 public ModelOscillatorStream open(float samplerate) { 127 ModelAbstractOscillator oscs; 128 try { 129 oscs = this.getClass().newInstance(); 130 } catch (InstantiationException e) { 131 throw new IllegalArgumentException(e); 132 } catch (IllegalAccessException e) { 133 throw new IllegalArgumentException(e); 134 } 135 oscs.setSampleRate(samplerate); 136 oscs.init(); 137 return oscs; 138 } 139 getPerformer()140 public ModelPerformer getPerformer() { 141 // Create performer for my custom oscillirator 142 ModelPerformer performer = new ModelPerformer(); 143 performer.getOscillators().add(this); 144 return performer; 145 146 } 147 getInstrument()148 public ModelInstrument getInstrument() { 149 // Create Instrument object around my performer 150 SimpleInstrument ins = new SimpleInstrument(); 151 ins.setName(getName()); 152 ins.add(getPerformer()); 153 ins.setPatch(getPatch()); 154 return ins; 155 156 } 157 getSoundBank()158 public Soundbank getSoundBank() { 159 // Create Soundbank object around the instrument 160 SimpleSoundbank sbk = new SimpleSoundbank(); 161 sbk.addInstrument(getInstrument()); 162 return sbk; 163 } 164 getDescription()165 public String getDescription() { 166 return getName(); 167 } 168 getInstrument(Patch patch)169 public Instrument getInstrument(Patch patch) { 170 Instrument ins = getInstrument(); 171 Patch p = ins.getPatch(); 172 if (p.getBank() != patch.getBank()) 173 return null; 174 if (p.getProgram() != patch.getProgram()) 175 return null; 176 if (p instanceof ModelPatch && patch instanceof ModelPatch) { 177 if (((ModelPatch)p).isPercussion() 178 != ((ModelPatch)patch).isPercussion()) { 179 return null; 180 } 181 } 182 return ins; 183 } 184 getInstruments()185 public Instrument[] getInstruments() { 186 return new Instrument[]{getInstrument()}; 187 } 188 getResources()189 public SoundbankResource[] getResources() { 190 return new SoundbankResource[0]; 191 } 192 getVendor()193 public String getVendor() { 194 return null; 195 } 196 getVersion()197 public String getVersion() { 198 return null; 199 } 200 } 201