1/*
2 * Copyright (c) 2007, Oracle and/or its affiliates. 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.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.media.sound;
27
28import java.io.IOException;
29
30import javax.sound.midi.Instrument;
31import javax.sound.midi.MidiChannel;
32import javax.sound.midi.Patch;
33import javax.sound.midi.Soundbank;
34import javax.sound.midi.SoundbankResource;
35import javax.sound.midi.VoiceStatus;
36
37/**
38 * A abstract class used to simplify creating custom ModelOscillator.
39 *
40 * @author Karl Helgason
41 */
42public abstract class ModelAbstractOscillator
43        implements ModelOscillator, ModelOscillatorStream, Soundbank {
44
45    protected float pitch = 6000;
46    protected float samplerate;
47    protected MidiChannel channel;
48    protected VoiceStatus voice;
49    protected int noteNumber;
50    protected int velocity;
51    protected boolean on = false;
52
53    public void init() {
54    }
55
56    @Override
57    public void close() throws IOException {
58    }
59
60    @Override
61    public void noteOff(int velocity) {
62        on = false;
63    }
64
65    @Override
66    public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber,
67                       int velocity) {
68        this.channel = channel;
69        this.voice = voice;
70        this.noteNumber = noteNumber;
71        this.velocity = velocity;
72        on = true;
73    }
74
75    @Override
76    public int read(float[][] buffer, int offset, int len) throws IOException {
77        return -1;
78    }
79
80    public MidiChannel getChannel() {
81        return channel;
82    }
83
84    public VoiceStatus getVoice() {
85        return voice;
86    }
87
88    public int getNoteNumber() {
89        return noteNumber;
90    }
91
92    public int getVelocity() {
93        return velocity;
94    }
95
96    public boolean isOn() {
97        return on;
98    }
99
100    @Override
101    public void setPitch(float pitch) {
102        this.pitch = pitch;
103    }
104
105    public float getPitch() {
106        return pitch;
107    }
108
109    public void setSampleRate(float samplerate) {
110        this.samplerate = samplerate;
111    }
112
113    public float getSampleRate() {
114        return samplerate;
115    }
116
117    @Override
118    public float getAttenuation() {
119        return 0;
120    }
121
122    @Override
123    public int getChannels() {
124        return 1;
125    }
126
127    @Override
128    public String getName() {
129        return getClass().getName();
130    }
131
132    public Patch getPatch() {
133        return new Patch(0, 0);
134    }
135
136    @Override
137    @SuppressWarnings("deprecation")
138    public ModelOscillatorStream open(float samplerate) {
139        ModelAbstractOscillator oscs;
140        try {
141            oscs = this.getClass().newInstance();
142        } catch (ReflectiveOperationException e) {
143            throw new IllegalArgumentException(e);
144        }
145        oscs.setSampleRate(samplerate);
146        oscs.init();
147        return oscs;
148    }
149
150    public ModelPerformer getPerformer() {
151        // Create performer for my custom oscillirator
152        ModelPerformer performer = new ModelPerformer();
153        performer.getOscillators().add(this);
154        return performer;
155
156    }
157
158    public ModelInstrument getInstrument() {
159        // Create Instrument object around my performer
160        SimpleInstrument ins = new SimpleInstrument();
161        ins.setName(getName());
162        ins.add(getPerformer());
163        ins.setPatch(getPatch());
164        return ins;
165
166    }
167
168    public Soundbank getSoundBank() {
169        // Create Soundbank object around the instrument
170        SimpleSoundbank sbk = new SimpleSoundbank();
171        sbk.addInstrument(getInstrument());
172        return sbk;
173    }
174
175    @Override
176    public String getDescription() {
177        return getName();
178    }
179
180    @Override
181    public Instrument getInstrument(Patch patch) {
182        Instrument ins = getInstrument();
183        Patch p = ins.getPatch();
184        if (p.getBank() != patch.getBank())
185            return null;
186        if (p.getProgram() != patch.getProgram())
187            return null;
188        if (p instanceof ModelPatch && patch instanceof ModelPatch) {
189            if (((ModelPatch)p).isPercussion()
190                    != ((ModelPatch)patch).isPercussion()) {
191                return null;
192            }
193        }
194        return ins;
195    }
196
197    @Override
198    public Instrument[] getInstruments() {
199        return new Instrument[]{getInstrument()};
200    }
201
202    @Override
203    public SoundbankResource[] getResources() {
204        return new SoundbankResource[0];
205    }
206
207    @Override
208    public String getVendor() {
209        return null;
210    }
211
212    @Override
213    public String getVersion() {
214        return null;
215    }
216}
217