[Java/Midi] Veranderen midiprogram onsuccesvol

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Mammon
  • Registratie: December 2006
  • Laatst online: 24-08 20:45
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

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 ]


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Mammon schreef op maandag 10 augustus 2009 @ 17:08:
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

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
    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);

Gecompileerd met jdk1.6.0_13
Moet je de channels niet pas opvragen na het initialiseren van de bank? Daarnaast is het nog dubieus om initialisatie te doen in een regel die ook logt. Doe eerst de initialisatie, daarna pas het loggen.

[ Voor 32% gewijzigd door Remus op 10-08-2009 20:04 ]


Acties:
  • 0 Henk 'm!

  • Mammon
  • Registratie: December 2006
  • Laatst online: 24-08 20:45
Remus schreef op maandag 10 augustus 2009 @ 20:02:
Moet je de channels niet pas opvragen na het initialiseren van de bank?
Helaas dat maakt niet uit.
Remus schreef op maandag 10 augustus 2009 @ 20:02:
Daarnaast is het nog dubieus om initialisatie te doen in een regel die ook logt. Doe eerst de initialisatie, daarna pas het loggen.
Daar ben ik het helemaal mee eens. Ik heb dit alleen zo gedaan om zo wat informatie te loggen en de code kort te houden.

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Wat gebeurt er als je bank 0 wil ophalen? Of bank 2? Kan je de waarde van de variabele bank ook eens afdrukken of loggen nadat je de bank hebt opgehaald?

[ Voor 49% gewijzigd door kluyze op 10-08-2009 23:30 ]


Acties:
  • 0 Henk 'm!

  • Mammon
  • Registratie: December 2006
  • Laatst online: 24-08 20:45
Bij bank 0 gaat het goed. Bank 2 bestaat niet in deze soundbank. De variabele bank blijft onveranderd.