Windows: feines fetes

De Wikijoan
Dreceres ràpides: navegació, cerca

Nota: hauria d'actualitzar aquest article provant la tarja de so que ara tinc, l'Edirol UA-25EX

Contingut

Introducció

Abans de començar a treballar amb Ubuntu Studio he fet les proves de MidiShare amb Windows. La versió per a windows també es pot descarregar de Sourceforge. Després de solucionar problemes de configuració, he obtingut resultats. Les proves les vaig fer amb la targeta de so externa Edirol FA-66 (firewire), que funciona molt bé amb Windows però que no hi ha hagut manera de fer funcionar amb Linux.

el que sé fer ara (he estat treballant amb MidiShare a Windows, amb la tarja EDIROL FA-66-firewire, abans de ficar-me amb Linux):

ara sé treballar amb la llibreria midishare enviant notes al MIDI OUT que està mapejat a la targeta de sol EDIROL. Quan la connecto al teclat Casio, que fa el paper de sintetitzador, sento els sons que em proporciona el CASIO.

Tot això ho faig mapejant les connexions i els ports d'entrada i de sortida, sense haver de programar res.

El que també he fet amb l'entorn midishare-windows, programant amb JAVA, és la següent aplicació. Tinc el Yamaha WX5 connectat a la targeta de so (MIDI IN), i el teclat CASIO a la sortida (MIDI OUT). Una petita aplicació JAVA captura els events que vénen del controlador de vent, canvia el so de forma aleatòria (program change), i envia la sortida al teclat CASIO, on sonen instruments aleatoris. Aquí és on em vaig quedar en la part de Windows, abans de començar a treballar amb Ubuntu Studio.

Per treballar amb Ubuntu Studio, el primer pas és aconseguir una trageta de so externa amb capacitat MIDI IN/OUT. La targeta elegida és la Edirol UA25-EX, de Roland.

Compilació de projectes amb la llibreria JMusic

Tots els exemples estan trets de la pàgina web del projecte: http://jmusic.ci.qut.edu.au/

des del directori de JavaWork, executem en la línia de comandes (cmd.exe) o, millor, fiquem la comanda en un bat

C:> javac -classpath "C:\jMusic\lib\jmusic.jar" c:\jMusic\JavaWork\Test.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" Test
//en aquest cas necessito compilar dos fitxers al mateix temps
C:> javac -classpath "C:\jMusic\lib\jmusic.jar" c:\jMusic\JavaWork\Jm808.java c:\jMusic\JavaWork\Jm808_GUI.java
//no troba la classe SimpleSampleInst.class, per tant afegeixo C:\jMusic\lib\inst dins del classpath
C:> javac -classpath "C:\jMusic\lib\jmusic.jar;C:\jMusic\lib\inst" c:\jMusic\JavaWork\AudioDrums.java
C:> javac -classpath "C:\jMusic\lib\jmusic.jar;C:\jMusic\JavaWork" c:\jMusic\JavaWork\BasicBeat.java

QTJava

QuickTime for Java provides a set of cross-platform APIs which allows Java developers to build multimedia, including streaming audio and video, into applications and applets.

s'ha fet el port a Linux, és un projecte de SourceForge

en ppi per treballar amb la llibreria QTJava no cal tenir instal.lat el QuickTime

no ho he pogut baixar de SoundForge, m'ho baixo directament de Apple: http://developer.apple.com/quicktime/qtjava/

In order to install QuickTime for Java, developers will need to select 'QuickTime for Java' in the 'Custom' install option. The installers can be found at the following location:

http://www.apple.com/quicktime/download/

QTJava will be depreciated next year...

al final m'ho he baixat de sourceforge

C:> javac -classpath "C:\jMusic\lib\jmusic.jar;C:\jMusic\qtjava_Win32_RC3\qtjava.jar" c:\jMusic\JavaWork\BasicGame7.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork;C:\jMusic\qtjava_Win32_RC3\qtjava.jar" BasicGame7

compte! és import jmqt.*; (el tutorial està malament)

Gong.java

C:> javac -classpath "C:\jMusic\lib\jmusic.jar" c:\jMusic\JavaWork\SimpleSineInst.java c:\jMusic\JavaWork\Gongs.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" Gongs

javaSound MIDI Playback

C:> javac -classpath "C:\jMusic\lib\jmusic.jar" c:\jMusic\JavaWork\MidiSynthTest.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" MidiSynthTest

JMusic i MidiShare

C:> javac -classpath "C:\jMusic\lib\jmusic.jar"  c:\jMusic\JavaWork\MPlayerTester.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" MPlayerTester

(ja ho havia provat més amunt, i ara funciona). Tanmateix, amb el Edirol no se sent res, i el problema és que en aquest exemple no puc configurar res com el port o el canal.

C:> javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" c:\jMusic\JavaWork\MSRecieveTest.java
C:> java -classpath "c:\jMusic\JavaWork" MSRecieveTest

Endollo el WX-5 i arriben molts missatges, sense bufar cap nota. Si apago el WX5 no rebo cap missatge, ok. De tots els missatges que es reben hauria de discriminar quins corresponen a Note ON, i fer pitar-los.

Mètode:

ReceiveAlarm(int) - Method in class grame.midishare.MidiAppl
The ReceiveAlarm method is automatically called when Midi events are received.

RealTime

C:> javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" c:\jMusic\JavaWork\rotb\MidiPart.java

no m'acaba de funcionar

C:> java -classpath "c:\jMusic\JavaWork" rotb.MidiPart
javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" c:\jMusic\JavaWork\rotb\Recieve1.java
de moment no funciona
java -classpath "c:\jMusic\JavaWork" rotb.Recieve1
javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" c:\jMusic\JavaWork\rotb\Recieve2.java
java -classpath "c:\jMusic\JavaWork" rotb.Recieve2

Exemple Invaders

(http://www.planetalia.com/cursos/)

compilació amb paquets

en el codi s'especifica la versió, mitjançant un paquet:

package version01;

això vol dir que el font l'hem de guardar dins la carpeta /version01, i el compilem de la següent manera:

C:> javac c:\invaders\version01\Invaders.java

i l'executem:

C:> java -classpath "c:\invaders" version01.Invaders

versió 10, línia 42: canvio

ventana.createBufferStrategy(2); //no funciona

per

ventana.createBufferStrategy(1);

version13:

C:> javac c:\invaders\version13\SpriteCache.java
C:> javac -classpath "C:\invaders" c:\invaders\version13\Stage.java
C:> javac -classpath "C:\invaders" c:\invaders\version13\Actor.java
C:> javac -classpath "C:\invaders" c:\invaders\version13\Monster.java
C:> javac -classpath "C:\invaders" c:\invaders\version13\Invaders.java

Invaders és el que té el main:
C:> java -classpath "c:\invaders" version13.Invaders


Midishare a Windows

Com instal.lar-ho a Windows XP, i que funcionin els exemples del tutorial de JMusic:

o bé the grame.jar file contains the native classes, it must be installed in the local JVM (usually in JRExx/lib/extensions) (extensions o ext)

C:> javac -classpath "C:\jMusic\lib\jmusic.jar"  c:\jMusic\JavaWork\MPlayerTester.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork;C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" MPlayerTester
o més curt si fico el grame.jar dins de JRExx/lib/ext:
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" MPlayerTester

compila bé i s'executa bé, però no aconsegueixo que soni res. Falta configurar els ports del midishare (fitxer msDrivers.exe)

C:> javac -classpath "C:\jMusic\lib\jmusic.jar;C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar"  c:\jMusic\JavaWork\MSRecieveTest.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" MSRecieveTest

hi ha un tutorial en forma d'applet a:

C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\tutorial

The MidiShare Java Tutorial: Part1 explains the basic MidiShare functions which can be accessed from Java. You will learn here how to open and manage MidiShare applications, manage inter-applications connections and send Midi events.

C:> javac c:\jMusic\JavaWork\AppletFrame.java
C:> javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar"  c:\jMusic\JavaWork\AppletFrame.java c:\jMusic\JavaWork\TutorialPart1.java
[compila bé]
C:> java -classpath "c:\jMusic\JavaWork" TutorialPart1

C:> javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar"  c:\jMusic\JavaWork\AppletFrame.java c:\jMusic\JavaWork\TutorialPart2.java
C:> java -classpath "C:\jMusic\lib\jmusic.jar;c:\jMusic\JavaWork" TutorialPart2

he trobat per Internet un exemple interessant, MidiShareIOTest.java:

package testmidishare;
import java.awt.*;
import java.awt.event.*;

import grame.midishare.*;

/** Test for MidiShare's Java API.  Sends Midi and receives Midi, printing message types of incoming MIDI.
*
* Uses MidiShare's Java API (no JMSL at all). 
* Get this working before troubeshooting JMSL + MidiShare
*
* IMPORTANT: Change inport and output values in main() for your system !!!!!!!!!!
*
* @author Nick Didkovsky, didkovn@mail.rockefeller.edu 4/15/04
*/

public class MidiShareIOTest extends MidiAppl {

    int inport;
    int outport;

    public MidiShareIOTest(int inport, int outport) {
        this.inport = inport;
        this.outport = outport;
    }

    public void Open(String name) throws MidiException {
        super.Open(name);
        configureFilter();
    }

    /* kill active sensing */
    void configureFilter() {
        int i;
        for (i = 0; i < 256; i++) {
            //Midi.AcceptPort(filter, i, 1);
            Midi.AcceptPort(filter, i, 0);
            Midi.AcceptType(filter, i, 1);
        }

        for (i = 0; i < 16; i++) {
            Midi.AcceptChan(filter, i, 1);
        }
        Midi.AcceptPort(filter, inport, 1);
        Midi.AcceptType(filter, Midi.typeActiveSens, 0);
        //    Midi.AcceptType(filter, Midi.typeSysEx, 0);
        //    System.out.println("MidiShare configureFilter() filter#" + filter);
    }

    /** Simply notify that an input event occurred, print what kind */
    public void ReceiveAlarm(int ev) {
        switch (Midi.GetType(ev)) {
            case Midi.typeNote :
                System.out.println("MidiShareIOTest, received typeNote");
                break;
            case Midi.typeKeyOn :
                System.out.println("MidiShareIOTest, received typeKeyOn");
                break;
            case Midi.typeKeyOff :
                System.out.println("MidiShareIOTest, received typeKeyOff");
                break;
            case Midi.typeKeyPress :
                System.out.println("MidiShareIOTest, received typeKeyPress");
                break;
            case Midi.typeCtrlChange :
                System.out.println("MidiShareIOTest, typeCtrlChange");
                break;
            case Midi.typeProgChange :
                System.out.println("MidiShareIOTest, received typeProgChange");
                break;
            case Midi.typeChanPress :
                System.out.println("MidiShareIOTest, received typeChanPress");
                break;
            case Midi.typePitchWheel :
                System.out.println("MidiShareIOTest, received typePitchWheel");
                break;
            case Midi.typeSysEx :
                System.out.println("MidiShareIOTest, received typeSysEx");
                break;
            default :
                break;
        }
        Midi.FreeEv(ev);
    }

    void playNotes() {
        int channel = 1;
        int pitch = 60;
        int vel = 80;
        for (int interval = 0; interval < 4; interval++) {
            int event = Midi.NewEv(Midi.typeKeyOn); // ask for a new note event
            if (event != 0) { // if the allocation was succesfull
                Midi.SetChan(event, channel); // set the Midi channel
                Midi.SetPort(event, outport); // set the destination port
                Midi.SetField(event, 0, pitch + interval); // set the pitch field
                Midi.SetField(event, 1, vel); // set the velocity field
                Midi.SendIm(refnum, event);
            }
            System.out.println("Sent Midi note on " + (pitch + interval));
            try {
                Thread.sleep(200);
            }
            catch (InterruptedException e) {
            }

            event = Midi.NewEv(Midi.typeKeyOff);

            if (event != 0) {
                Midi.SetChan(event, channel);
                Midi.SetPort(event, outport);
                Midi.SetField(event, 0, pitch + interval);
                Midi.SetField(event, 1, vel);
                Midi.SendIm(refnum, event);
            }
            System.out.println("Sent Midi note off " + (pitch + interval));
            try {
                Thread.sleep(200);
            }
            catch (InterruptedException e) {
            }
        }
    }

    public static void main(String args[]) {
        // set these how you want them
        int inport = 0;
        int outport = 1;

        int installed = 0;
        try {
            installed = Midi.Share();
        }
        catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
            System.out.println(
                "\nMidiShare Java API probably not installed properly, grame.midishare.Midi.Share() barfed.\n" + e);
            System.exit(0);
        }

        System.out.println("installed = " + installed);
        int version = Midi.GetVersion();
        System.out.println("version = " + version);
        int numberOfAppl = Midi.CountAppls();
        System.out.println("numberOfAppl = " + numberOfAppl);

        final MidiShareIOTest midiHandler = new MidiShareIOTest(inport, outport);

        Frame f = new Frame("Watch console for incoming midi messages. Close this frame to quit");

        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.out.println("Closing Midi, byebye");
                midiHandler.Close();
                System.exit(0);
            }
        });
        Button playButton = new Button("play notes");
        f.add(playButton);
        playButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                midiHandler.playNotes();
            }
        });
        f.setSize(600, 100);
        f.setVisible(true);

        try {
            midiHandler.Open("MidiShareIOTest");
            Midi.Connect(midiHandler.refnum, 0, 1);
            Midi.Connect(0, midiHandler.refnum, 1);
            // Check output connection
            int connected = Midi.IsConnected(midiHandler.refnum, 0);
            System.out.println("Connected for input? " + connected);

            // Check input connection
            connected = Midi.IsConnected(0, midiHandler.refnum);
            System.out.println("Connected for output? " + connected);

            StringBuffer text = new StringBuffer();
            short i;
            int ref, n = Midi.CountAppls();
            text.append("List of MidiShare client applications\n");
            text.append("-------------------------------------\n");
            for (i = 1; i <= n; i++) {
                ref = Midi.GetIndAppl(i); // get the refnum from the order number
                text.append(String.valueOf(i));
                text.append(" : reference number ");
                text.append(String.valueOf(ref));
                text.append(" name : ");
                text.append(Midi.GetName(ref));
                text.append("\n");
            }
            text.append("-------------------------------------");
            System.out.println(text.toString());
        }
        catch (MidiException e1) {
            System.out.println("Error opening MidiShareIOTest: " + e1);
            e1.printStackTrace();
        }

    }
}
C:> javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" c:\jMusic\JavaWork\testmidishare\MidiShareIOTest.java
compila bé
he de crear la carpeta testmidishare (és un paquet)
C:> java -classpath "C:\jMusic\JavaWork" testmidishare.MidiShareIOTest

s'executa, però no se sent res

http://www.algomusic.com/TestDev/ -> hi ha tot el projecte

C:> javac -classpath "C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\grame.jar" c:\jMusic\JavaWork\testmidishare\SimpleMidiShareTest.java

compila bé

he de crear la carpeta testmidishare (és un paquet)

C:> java -classpath "c:\jMusic\JavaWork" testmidishare.SimpleMidiShareTest

funciona bé, però no se sent res

informació a la Classe Midi de midishare:

C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\doc\index-all.html
C:\jMusic\midishare-1.91-win32\midishare-1.91-win32\Developer\Java\doc\grame\midishare\Midi.html


ReturnOfTheBeast

C:> javac c:\returnofthebeast\returnofthebeast\Prova.java
C:> javac c:\returnofthebeast\invaders_meu\versio_meva_1\Invaders.java

i l'executem:

C:> java -classpath "c:\returnofthebeast" returnofthebeast.Prova
C:> java -classpath "c:\returnofthebeast\invaders_meu" versio_meva_1.Invaders

conclusions_260908.txt

He estat treballant amb els fitxers de configuració que vénen en la llibreria midishare-1.91-win32: msControl32.exe i msDrivers32.exe (per a Windows, suposo que en Linux hi ha aplicacions equivalents) i n'he tret unes quantes conclusions.

el msDrivers.exe configura per a cada port (0-127), els dispositius d'entrada i de sortida que el mapegen. S'entén fàcil, té un htm que explica com configurar-ho.

Canals

per a la targa interna, estan activats tots els canals (1-16)

Tinc el Edirol (FA-66) connectat al Casio CTK-731

Aleshores m'he de fixar molt en la configuració dels canals per tal de què soni correctament. Primer de tot, en el Casio he de seleccionar amb el botó 'mixer select' la posició EXTERNAL (hi ha 4 possibilitats: internal, external, external solo i external play). Aleshores queda marcat cada canal si està activat o desactivat.

Per editar un canal, l'apreto i Enter. Quan fa pampallugues estic en mode edició, i aleshores puc editar el programa (instrument), volum i on/off, que també l'activa o desactiva.

Tot això es pot practicar amb l'aplicatius msControl32.exe, que proporciona midishare. Quan clico sobre port, canal, pitch i vel provoca un event de Nota, que es pot escoltar si el port i el canal estan ben configurats per escoltar-ho. (Si clico sobre prog, vol, mod i pan no provoca event de Note ON)


Ara bé, el msControl32.exe no et deixa escollir amb quin dispositiu treballa. Per tant, suposo que només treballa amb el primer que troba, que és el Edirol. Vull dir, que, si tinc el Edirol connectat i el port 6 va dirigit a la sortida per la targeta interna, quan actuo sobre un port que el Edirol no està mapejat i la tarja interna sí, no se sent res. En canvi, si desconecto el Edirol, sí que se sent.

Però ja veig el que passa. I és que tenia en la configuració de so del Windows (configuració > Audio > pestanya Audio) el dispositiu per defecte el Edirol. Si fico la targa interna (Sigma Tel), aleshores aquest defecte ja no em passa, i si tinc mapejat un port per als dos dispositius, se senten els dos dispositius.

El que encara no he aconseguit és que em soni el TutorialPart1.java. El programa compila bé, però no hi ha manera que soni.

El problema crec que està en el test18 (Display MidiShare drivers informations) i test19 (Display port to slot connection state), que no es veu res i s'hauria de mostrar el mapeig dels ports amb els dispositius corresponents.

Fins que això no ho arregli no sonarà res en el test14 i test15.

Solució!! Ja ho he aconseguit!! Només cal llegir bé!!

en el readme.txt que hi ha a /midishare-1.91-win32 queda ben especificat que:

Put the mshare32.dll, midishare.ini and the desired drivers
into the application folder (any MidiShare client application)
The file mshare32.dll is the current MidiShare kernel library.
For the drivers setup, see the drivers section.

Jo havia copiat el mshare.dll i el midishare.ini

Però també s'ha de copiar els drivers desitjats, que en el nostre cas és el msMMSystem.dll i msMMSystem.ini

Un altre tema que m'he trobat:

el contingut del fitxer msMMSystem.ini, que representa informació del driver que instal.la midishare, és del tipus:

[error]
messagebox="no"
[Input Slots]
Creative Sound Blaster MPU-401=
EDIROL FA-66 MIDI IN=1                                                                                             
[Output Slots]
Creative Sound Blaster MPU-401=
Synthé. SW table de sons GS Mic=
Sint. SW de tabla de ondas GS=0 1 2 4 5 10 37 38                                                     

això significa que sentir notes en els ports especificats en el Output Slots. Si modifico de forma gràfica aquests ports, s'escriu el fitxer msMMSystem.ini, però aquest s'ha de copiar en la carpeta del meu directori de treball per tal de què es llegeixi la informació correcta. Dit d'una altra manera: és pràctic editar manualment aquest fitxer en la carpeta del directori de treball, sense utilitzar la utilitat gràfica

En el TutorialPart1.java, en el test19, es llegeix informació sobre aquests output slots.

Recuperant informació antiga: Mabry software

El que sí que he aconseguit que em funcioni és el programa VB midiwx.

C:\pentagrama\midiwx

que utilitza els drivers de Mabry software

he aconseguit pitar el WX-5 tant per la tarja interna (molta latència) com pel Edirol FA-66 via CTK-731 (latència raonable). tot això en WXP, és clar.


creat per Joan Quintana Compte, setembre 2009

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines