[Java] MIDI-muziek werkt niet goed met JRE6

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Hey,

Voor een schoolprojectje maken we een spel in Java. Het is de bedoeling dat er in het spelmenu andere muziek afspeelt dan in het spel zelf. Hiervoor maken we gebruik van 2 verschillende sequencers. De code ziet er (enorm vereenvoudigd voor dit topic) zo uit:

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
import java.io.File;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class Music {
    private Sequencer sequencer1;
    private Sequencer sequencer2;
    private Sequence sequence1;
    private Sequence sequence2;
    
    public Music() {
        try {
            this.sequence1 = MidiSystem.getSequence(new File("midi1.mid"));
            this.sequence2 = MidiSystem.getSequence(new File("midi2.mid"));
            this.sequencer1 = MidiSystem.getSequencer();
            this.sequencer2 = MidiSystem.getSequencer();
            this.sequencer1.open();
            this.sequencer2.open();
            
            this.sequencer1.setSequence(sequence1);
            this.sequencer2.setSequence(sequence2);
        } catch (Exception e) { /* Jammer dan */ }
    }
    
    public void playSequencer1() {
        this.sequencer1.start();
    }
    
    public void stopSequencer1() {
        this.sequencer1.stop();
    }
    
    public void playSequencer2() {
        this.sequencer2.start();
    }
    
    public void stopSequencer2() {
        this.sequencer2.stop();
    }
}


Gebruik maken van slechts 1 sequencer en bij de onderste methoden slechts de sequence instellen is geen optie, want het is de bedoeling dat de muziek onderbroken en hervat wordt, niet opnieuw gestart. Het zou logisch zijn dat MidiSystem.getSequencer() altijd hetzelfde object returned, maar aangezien dit stuk code lange tijd bleek te werken, heb ik me er nooit vragen bij gesteld.

Wanneer iets geselecteerd wordt, doe ik simpelweg dit:
Java:
1
2
3
                    
music.stopSequencer1();
music.playSequencer2();


Wanneer er dan terug naar het menu gegaan wordt, doe ik het omgekeerde (1 methode switchSequencer() is in dit voorbeeld waarschijnlijk beter, maar je snapt het punt wel). Dit heeft altijd perfect gewerkt. Tot ik op school JRE6 moest installeren omdat een bepaald project niet in JRE7 niet werkend te krijgen was.

Met JRE6 geeft dit dus wel problemen. Als er tweemaal veranderd wordt, hoor je de 2 stukken muziek door elkaar. Ik vermoed dat dit komt door verkeerd gebruik van de getSequencer()-methode, maar heb geen idee hoe ik dit kan aanpassen en er ook voor kan zorgen dat de muziek gewoon hervat wordt en niet opnieuw gestart.

Ik heb even in Eclipse een heel simpel projectje aangemaakt om het probleem te illustreren. Als je het programma start en tweemaal op de knop klikt, zal je merken dat er niet goed opnieuw wordt overschakeld naar muziek #1. Als je echter in het bestand .classpath "JavaSE-1.6" naar "JavaSE-1.7" veranderd (en deze uiteraard ook allebei kunt gebruiken), zal je merken dat het opeens wel werkt. Link:
https://rapidshare.com/files/4086285036/TestMusicProblem.rar

Iemand een idee hoe ik dit best kan oplossen? Het zou leuk zijn mocht dit ook gewoon met met JRE6 werken. De midi-files zijn trouwens van een gratis midi-website gehaald, voor het geval er iemand hier moeilijk om wilt doen.

Bedankt!

Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Ik heb nog nooit met de java sequencer gewerkt, maar ik zie dat het mogelijk is de positie in microseconds op te vragen en in te stellen: http://docs.oracle.com/ja...sound/midi/Sequencer.html
Is het geen optie om 1 sequencer te hebben en vervolgens bij te houden waar de midi file is op het moment dat je de andere midi file start?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
^ Wat hij zegt; als ik in de documentatie kijk:
getSequencer
Obtains the default sequencer.
Je wil natuurlijk niet 2 keer de default sequencer hebben. Hoe je aan een nieuwe sequencer komt (en of 't überhaupt kan) zie ik zo snel niet (en de "taxi" staat te wachten dus ik heb geen tijd verder te lezen :P )

Ik vind 't overigens vreemd dat dit onder 7 wel goed zou werken; daar staat namelijk exact 'tzelfde:
getSequencer
Obtains the default sequencer.

[ Voor 23% gewijzigd door RobIII op 08-12-2011 19:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Bedankt, ik zal hier even naar kijken :)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik kan dit niet reproduceren met jre6 u29 (64 bit). Het werkt gewoon goed hier, of ik nu 6u29 of 7u1 gebruik. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Vreemd... heb op school ook al gemerkt dat het probleem niet bij iedereen opduikt :s

Maar de oplossing van het bijhouden van de microseconden lijkt te werken, bedankt :)
Pagina: 1