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