MidiDevice-Object übergeben : geht nicht!?

ich probiers in den nächsten tagen aus. und melde mich!
ich hoffe es klappt. nicht dass der bock wo ganz anders liegt.


gruß marco
 
Hi,

schlechte Nachrichten... geht genauso wenig!
Der Konstruktor, hat meiner Meinung nach eh nix gebracht, weil er ja nie aufgerufen wird.

Mein Programm hat auch schon vorher mit den internen Synthies funktioniert. Aber ich will ja auf den ext. Midiport zugreifen und da bekomme ich immer noch die MidiUnavailableExecp.

Ich kann dir gerne mal das ganze Projekt zuschicken. Du brauchst aber dazu eine "richtige" Soundkarte. Sonst bekommst du die Fehlermeldung ja nicht.

Wie gesagt manuell im Code auswählen kein Problem. Über den Dialog -> no function....
 
So ich glaube ich hab den Bug gefunden!

Aber eine Lösung fällt mir nicht ein....

Und zwar ist in meinem Dialogfenster der MidiInPort als Delta-AP-Port angegeben und der MidiOutPort als Delta-AP-Port. So wenn ich jetzt das Objekt übergebe, weiß die JVM nicht, welchen Port sie auswählen soll, den In oder Out!?

Ich habs nochmal mit der Indexnummer der Combobox versucht, indem ich nicht das Device sondern die Nummer des Devices zurückgebe.
Und das schlägt auch fehl!
Die Combobox sagt nämlich, Delta-AP-Port (auf Pos 0), hat die selbe Nummer wie Delta-AP-Port (auf Pos 3). -> nämlich auch 0. Egal welches von beiden Geräten ich auswähle die Box gibt immer 0 zurück. Obwohl sie korrekt zählt. Das 3. Objekt hat die nummer 4 usw. Nur eine 3 gibt es nicht!?

Interessant.....

Hast du ne idee?

Gruß Marco
 
Ich lese alle verfügbaren Geräte (wie du in deinem beispiel auch) in eine ComboBox ein. Dazu verwende ich den Device.getName();

Midi-In-Port heißt aber bei meiner Soundkarte nicht Midi-In-Port sondern nur Port. Und der Midi-Out-Port auch nur Port.

Kann es sein, dass die ComboBox deshalb die gleiche Nummer vergibt, weil ich Einträge identisch sind? Aber weshlab zählt sie dann richtig weiter?

Also in der ComboBox nach Index: genaus wie bei deiner ausgabe oben, nur dass ich an der ersten und dritten position die Soundkarte stehen hab.

Wenn ich mir dier indexnummern der ComboBox ausgeben lasse habe ich folgedne nummerierung:

0, 1, 2, 0, 4, 5 !

Das verstehe ich nicht; und da hängts glaube ich. Kein Gerät verfügbar ist dann eine klare Folgerung, wen immer nur der Midi-In-Port zur Ausgabe gewählt wird. Dieser sitzt auf Position 0.
Deshalb funktioniert auch die Ausgabe, wenn ich manuell die position 3 eingebe.
Die Combobox gibt aber, egal ob ich position 0 oder 3 anklicke immer 0 zurück.
Wähle ich z.B. Pos 2 oder 4 bekomme ich auch 2 oder 4 . Nur da gibts probleme.
 
Ich arbeite in der JComboBox nicht mit einem Index. MidiSystem.#getMidiDeviceInfo() liefert dir ein Array, da kann der Index auf keinen Fall zweimal vorkommen.

Probier folgendes Beispiel und poste zB die Augabe:

Java:
    public static void main(String[] args) {
        Info[] devices = MidiSystem.getMidiDeviceInfo();
        System.out.println(devices.length + " device(s) available:");
        for (int i = 0; i < devices.length; i++) {
            System.out.println("Device #" + i);
            System.out.println("Name: " + devices[i].getName());
            System.out.println("Version: " + devices[i].getVersion());
            System.out.println("Vendor: " + devices[i].getVendor());
            System.out.println("Description: " + devices[i].getDescription());
            System.out.println();
        }
    }

Bei mir sieht sie wie folgt aus:

Code:
4 device(s) available:
Device #0
Name: Microsoft MIDI-Mapper
Version: 5.0
Vendor: Unknown vendor
Description: Windows MIDI_MAPPER

Device #1
Name: Microsoft GS Wavetable SW Synth
Version: 5.10
Vendor: Unknown vendor
Description: Internal software synthesizer

Device #2
Name: Real Time Sequencer
Version: Version 1.0
Vendor: Sun Microsystems
Description: Software sequencer

Device #3
Name: Java Sound Synthesizer
Version: Version 1.0
Vendor: Sun Microsystems
Description: Software wavetable synthesizer and receiver

Das selbe solltest Du dann eigentlich auch aus deiner JComboBox bekommen - Wenn dem nicht so ist, stimmt eher etwas im GUI-Code nicht.
 
Zuletzt bearbeitet von einem Moderator:
Jain,

ich hab ja noch zusätzliche Soundkarten eingebaut! Da kommt mehr.

Also ich lese das Infoarray in die Combobox ein. Damit ich alle geräte in der combiobox stehen hab. Funktioniert.

Dann selekiterie ich das Gerät. Funktioniert. Allerdings ist der Eintrag 3 und 0 identisch.
Wenn ich mir die Indexnummer der Box ausgeben lasse erhalte ich 0,1,2,0,4.

Der explizite INdex 3 existiert bei mir nicht. Ich könnte höchstens ein eigenes DeviceObjekt generien, dass ich midigeraete nenne:

ungefähr so:

class Midigeraet{

MidiDevice midiDevice;
int deviceNumber;


public Midigeraet (MidiDevice m, int devNr){

..........
}
}

Dann ein array mit midiGeraet erzeugen und dann die ComboBox damit füttern.

Wäre noch ne Idee....

Ich schicke dir gerne mal den ganzen code! Kannst mir ja mal deine emailadresse schicken. Is ja nur 180Kb Sourcecode oder so.
 
.....komisch......


hier die DialogGui:
Code:
package gui;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.sound.midi.*;


public class MidiOutDialog extends JDialog{


	private JComboBox midiDevices = new JComboBox();
	private MidiDevice actualMidiDevice;
	private JLabel label = new JLabel("Bitte das gewünschte Gerät auswählen");
	private JButton ok_button = new JButton("OK");
	private GridBagLayout gbl = new GridBagLayout();
	private GridBagConstraints gbc;
	private int driverNumber =0;
	
	public MidiOutDialog(){
			
		super.setTitle("Midigerät wählen");
		
		initMidiDevice();
					
			midiDevices.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
						performSelection(midiDevices.getSelectedItem());
					
				}
			});
			
			ok_button.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					closeFrame();
				}
			});
			
			
			
			this.setLayout(gbl);
			
			gbc = new GridBagConstraints();
			gbc.gridx=0;
			gbc.gridy=0;
			gbc.gridwidth=1;
			gbl.addLayoutComponent(label, gbc);
			this.add(label);
			
			gbc = new GridBagConstraints();
			gbc.gridx=0;
			gbc.gridy=1;
			gbc.gridwidth=1;
			gbl.addLayoutComponent(midiDevices, gbc);
			this.add(midiDevices);
			
			gbc = new GridBagConstraints();
			gbc.gridx=0;
			gbc.gridy=2;
			gbc.gridwidth=2;
			gbl.addLayoutComponent(ok_button, gbc);
				
			this.add(ok_button);
			
			this.setModal(true);
			this.setBounds(100, 100, 330, 300);
		}
	

		private void initMidiDevice(){
			int anzahl = MidiSystem.getMidiDeviceInfo().length;
			for (int i = 0; i<anzahl; i++){
				midiDevices.addItem(MidiSystem.getMidiDeviceInfo()[i].getName());
				
				}
			}
		
		private void performSelection(Object selected) {
				
			try {
				actualMidiDevice = MidiSystem.getMidiDevice(MidiSystem.getMidiDeviceInfo()[midiDevices.getSelectedIndex()]);
				driverNumber = midiDevices.getSelectedIndex();
				System.out.println(actualMidiDevice.getDeviceInfo().getName());
			} catch (MidiUnavailableException e) {
				throwMidiUnavailable();
				e.printStackTrace();
			}
		}

		public MidiDevice returnMidiDeviceNumber(){
			return actualMidiDevice;
		}
		
		
		
		private void closeFrame(){
			
		this.setVisible(false);
		}
		
		
		public int returnSelectedDriver(){
			return driverNumber;
		}
		
		
	private void throwMidiUnavailable(){
		 JOptionPane.showMessageDialog(this,"Keine Midischnittstelle vorhanden!"	 
			 		,"Midifehler!", JOptionPane.ERROR_MESSAGE);
	}
		
	
	
}
 
Ich würde bei deinem Code wie früher schon von mir beschrieben mit dem MidiDevice.Info-Objekt direkt arbeiten und nicht über den Namen (getName()).

Das mit dem Index ergibt nicht viel Sinn - bei meinem vorherigen Beispiel werden alle Devices ausgegeben. Wenn Du wirklich zwei Devices mit dem selben Namen hast, kann ich mir vorstellen, dass Du ein Problem bekommst.

Poste doch einmal die Code-Ausgabe von meinem Beispiel oben - "Da kommt mehr" war nicht sehr aufschlussreich.
 
Hier die Ausgabe:

Aber ich übergebe ja nicht den Namen, sondern das MidiDeviceObjekt(!) und nicht nur den Namen. Wie gesagt das Problem liegt dann doch in der gui.

Egal ob ich das (siehe unten ) Device 0 oder Device 3 auswähle, die die gibt index 0 zurück. Die restliche Nummerierung passt aber.
Das hat nix mit dem Info-Objekt zu tun; sondern dass die gui das falsche Objekt ans MidiOutMetronom liefert. Das es auch mit meiner Version "manuell" funktioniert weiß ich ja. Schau dir lieber nochmal den gui-code an, und such da den bock. :-)


6 device(s) available:
Device #0
Name: Delta AP MIDI
Version: 5.10
Vendor: Unknown vendor
Description: No details available

Device #1
Name: Microsoft MIDI-Mapper
Version: 5.0
Vendor: Unknown vendor
Description: Windows MIDI_MAPPER

Device #2
Name: Microsoft GS Wavetable SW Synth
Version: 5.10
Vendor: Unknown vendor
Description: Internal software synthesizer

Device #3
Name: Delta AP MIDI
Version: 5.10
Vendor: Unknown vendor
Description: External MIDI Port

Device #4
Name: Real Time Sequencer
Version: Version 1.0
Vendor: Sun Microsystems
Description: Software sequencer

Device #5
Name: Java Sound Synthesizer
Version: Version 1.0
Vendor: Sun Microsystems
Description: Software wavetable synthesizer and receiver
 
Zurück