Voor een hobby project probeer ik geluiden uit de deluxe soundbank af te spelen. Het laden van deze soundbank gaat succesvol echter gaat het bij het veranderen van het programma mis. Ik krijg bank 0 terug terwijl ik bank 1 verwacht. Volgens de documentatie kan dit veroorzaakt worden doordat de synthesizer de soundbank niet ondersteund, echter als ik dit controleer (middels de isSoundbankSupported functie) wordt deze wel ondersteund.
De code om de channel op te halen komt uit de javadoc van MidiChannel.programChange
Gecompileerd met jdk1.6.0_13
De code om de channel op te halen komt uit de javadoc van MidiChannel.programChange
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| import java.io.*; import javax.sound.midi.*; import org.apache.log4j.*; public class MidiTest { private static final Logger logger = Logger.getLogger(MidiTest.class); public static void main(String[] args) { BasicConfigurator.configure(); // log4j configuration Synthesizer syn = null; Soundbank sb = null; try { File f = new File("src\\main\\resources\\sounds\\soundbank-deluxe.gm"); logger.debug(f.exists() && f.canRead()); // true sb = MidiSystem.getSoundbank(f); syn = MidiSystem.getSynthesizer(); syn.open(); } catch (InvalidMidiDataException ex) { logger.error("InvalidMidiDataException", ex); } catch (IOException ex) { logger.error("IOException", ex); } catch (MidiUnavailableException ex) { logger.error("No midi", ex); } int bank = 1; int program = 52; MidiChannel[] channels = syn.getChannels(); MidiChannel channel = channels[0]; logger.debug("Number of loaded instruments: " + syn.getLoadedInstruments().length); // 0 logger.debug(("Supported soundbank: " + syn.isSoundbankSupported(sb))); // true logger.debug("Loaded: "+ syn.loadAllInstruments(sb)); // true logger.debug("Number of loaded instruments: " + syn.getLoadedInstruments().length); // 189 logger.debug(sb.getInstrument(new Patch(bank, program))); // Instrument chinese cymbal (bank 1 program 52) logger.debug("Number of channels: "+channels.length); // 16 channel.programChange(bank, program); logger.debug(channel.getProgram()); // 52 logger.debug((channel.getController(0) * 128) + channel.getController(32)); // 0 ??? for(int counter = 0; counter<5; counter++) { channel.noteOn(66, 100); logger.debug("Play"); try { Thread.sleep(1000); } catch (InterruptedException ex) { logger.error("Interruped exception", ex); } channel.noteOff(66); } syn.close(); } } |
Gecompileerd met jdk1.6.0_13
[ Voor 0% gewijzigd door Mammon op 10-08-2009 19:09 . Reden: Java versie toegevoegd ]