2016-10-05 8 views
0

Ce que je souhaite faire est d'écrire un programme simple où chaque fois que j'appuie sur les touches de mon contrôleur MIDI externe, un récepteur interne accepte la note sur les messages et leur permet en quelque sorte à imprimer comme information d'octet. J'ai mis en place un récepteur qui est réglé sur l'émetteur de mon contrôleur MIDI matériel externe. Je ne suis pas sûr comment accéder aux informations MIDI du récepteur après qu'il est arrivé là. En termes de recherches que j'ai faites sur le sujet, j'ai lu des oracles midi over view et regardé divers exemples sur StackOverFlow. L'article Oracle explique comment connecter le récepteur et l'émetteur et comment envoyer ces informations à un synthé, mais ne couvre pas comment accéder aux messages Midi Short depuis le récepteur lui-même sans synthé ou séquenceur. Les exemples StackOverFlow ont des informations pertinentes mais je n'ai rien vu qui explique comment extraire des informations du récepteur lui-même. Si quelqu'un devait écrire un exemple de code, et écrire une explication détaillée, je pense que ce serait un excellent service pour les débutants comme moi, car il montrerait comment faire le premier pas dans l'écriture du code qui est compatible avec midi ie Comment recevoir les données midi en Java puis les premières étapes pour pouvoir l'utiliser. Voici un exemple de code de ce que j'essaie déjà. Je suis sûr qu'il y a beaucoup d'erreurs ici, mais s'il vous plaît, je suis nue avec moi. Merci beaucoup pour l'aide!Comment puis-je accéder à Midi Info après son arrivée à mon récepteur en Java

package receivemidiattempt; 

import javax.sound.midi.*; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class ReceiveMidiAttempt { 




public static void main(String[] args) { 



// My internal receiver which I set up with my own MidiReceiver class which implements 
// Receiver 

Receiver r = new MidiReceiver(); 




    //My Transmitter 
    Transmitter trans = null; 

    try { 
    //Setting up transmitter with the external midi controller 
     trans= MidiSystem.getTransmitter(); 

    } 
    catch(MidiUnavailableException e) 
    { 
     System.out.println("No Midi port Detected"); 
    } 

    //contecting the transmitter to my internal receiver 
    trans.setReceiver(r); 
    } 
    } 

Ive a obtenu l'émetteur et le récepteur connecté, mais ne suis pas sûr de ce qu'il faut faire d'ici pour extraire l'information midi du récepteur afin que je puisse l'imprimer. L'interface du récepteur n'a que deux méthodes, close et send, où close ferme le récepteur et Send envoie un message au récepteur lui-même. En espérant trouver un moyen de prendre l'information MIDI arrivant au récepteur et de la stocker dans une variable octet appelée midiInfo que je peux ensuite imprimer.

Très bien Je me suis amusé avec Java pendant une heure et j'ai presque compris. Je pense que ce qui m'embrouille, c'est la façon dont les méthodes fonctionnent dans une classe quand un objet de cette classe a été instancié. Par exemple en mettant println (msg) dans la méthode Send() de la classe que j'ai créée qui implémente le récepteur, sans invoquer la méthode, chaque fois que j'appuie sur une touche de mon contrôleur, un message bizarre apparaît comme @ 787fd et change à chaque fois. Si j'utilise msg.getLength je peux voir que chaque fois que j'appuie sur une touche le numéro 3 est imprimé. Ceci est logique si l'on considère qu'un message court a trois octets L'octet d'état, l'octet de hauteur et l'octet de vitesse. Ce que je ne peux toujours pas comprendre, c'est comment obtenir java pour imprimer les octets réels. Presque là cependant!

+0

Une chose qui me trouble est pourquoi Envoyer est exécutée même si je ne l'invoquez pas dans la méthode principale avec r.send() ; – AlexC

+0

Peut-être que ce qui se passe est que le réglage de l'émetteur à mon récepteur appelle la méthode envoyer. – AlexC

+0

D'accord, je l'ai compris !!!! J'ai fait un tableau d'octets bArray. Puis, dans la méthode, j'ai défini bArray = msg.getMessage. Maintenant, je peux imprimer n'importe quelle partie du tableau que je veux utiliser bArray [1], bArray [2] etc! C'est génial parce que maintenant je peux commencer à utiliser cette information pour que des choses plus compliquées se produisent !! hahaha je l'ai fait !!!!!!! oui !!!! – AlexC

Répondre

1

La meilleure façon de le faire serait d'utiliser JFugue:

// You'll need some try/catches around this block. This is traditional Java Midi code. 
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); 
MidiDevice device = MidiSystem.getMidiDevice(infos[0]); // You'll have to get the right device for your MIDI controller. 

// Here comes the JFugue code 
MusicTransmitterToParserListener m = new MusicTransmitterToParserListener(device); 
m.addParserListener(new ParserListenerAdapter() { 
    @Override public void onNotePressed(Note note) { 
     System.out.println(note + " pressed"); 
    } 
    @Override public void onNoteReleased(Note note) { 
     System.out.println(note + " released"); 
    } 
}); 

// Choose either this option: 
m.startListening(); 
...do stuff... 
m.stopListening(); 

// Or choose this option: 
m.listenForMillis(5000); // Listen for 5000 milliseconds (5 seconds) 
+0

Merci !!!! Je n'ai pas pensé à utiliser des auditeurs. Cela m'aidera beaucoup! Je t'ai voté. Ça ne le montrera pas parce que je suis un noob mais merci quand même. – AlexC

+0

Tout le meilleur Alex – AlexC

+0

@AlexC Vous ne pouvez pas répondre parce que vous n'avez pas assez de réputation. Si cela répond à votre question, vous devez accepter cette réponse. [Voici comment le faire] (http://meta.stackexchange.com/a/5235) – Programmer