50 ways... Android MIDI Controller with FingerPlayMIDI

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Abstract

Abstract in English

FingerPlay MIDI is a MIDI controller for the Android operating system. Any changes made to the controllers on the devices are sent over the wifi network using either OSC or an internal message format which is converted to MIDI by the server.

The layout of the controllers is defined in a XML file which can be changed depending on which controllers the user wants.

Resum

Objectius

Desenvolupament

Configuració i instal.lació. Resolució de problemes

FingerPlay MIDI is a MIDI controller for Android. Any changes made to the controllers on your phone are transmitted over the WIFI network to a receiving computer using either OSC messages or its own FingerPlay format. The MIDI messages can then be sent to any music software capable of receiving MIDI input.

En el Android ens hem d'instal.lar FingerPlay (gratuït)

Fingerply midi me'l puc baixar directament des d'aquest link

# adb install <path_to_apk>

l'aplicatiu adb (Android Debug Bridge, que gestiona l'emulador) està dins de la carpeta tools del directori on he instal.lat el SDK. Està dins de /home/joan/android/tools (set 2009)

joan@Ubuntu904:~/android/tools$ ./adb devices
List of devices attached 
HT94GNG02436	device

joan@Ubuntu904:~/android/tools$ ./adb install /home/joan/Documentos/FingerPlayMIDI.apk 
322 KB/s (127527 bytes in 0.385s)
	pkg: /data/local/tmp/FingerPlayMIDI.apk
Success

Per treballar amb la shell (però això ara no ho faig servir...)

$ ./adb -s HT94GNG02436 shell
#

Les fonts (el client i el servidor) me les puc baixar de:


En el servidor ens hem de descarregar FingerPlayServer zip-file, basat en java.Compte!!. Necessito la versió 0.8.0 per no tenir els mateixos problemes que estan explicats en els comentaris.

$ java -jar FingerPlayServer.jar

FingerPlayServer v0.8.0  <<-- fixar-se que la versió sigui la correcta.

Listening on 127.0.1.1:4444
Waiting for connection from phone..


Ho provo amb osculator: (m'oblido d'això del osculator)

OSCulator is available on Mac OS X 10.4 and later.

OSC Server a Linux: http://www.linuxjournal.com/content/introduction-osc

You can use http://puredata.info/ to receive OSC messages, but it can be a bit tricky to set up.

Llegint els comentaris del post original de gent que ho intenta fer funcionar sobre Linux:

 92. flat20 - August 10, 2009

    alejandro, tekrytor, divide,

    I got the FingerPlay server to see virtual MIDI devices in linux using the ALSA VirMidi module.

    http://alsa.opensrc.org/index.php/VirMidi

    Unfortunately I had to change some code to get FingerPlay MIDI to list the MIDI ports properly, but I’ll upload an update to the app and the server in the next coming days. This update should make it work on linux.
 98. flat20 - August 15, 2009

    Here’s a VERY brief explanation on how to get it to run on linux with http://www.mixxx.org/ – I tried it with ubuntu:

    Run this command on the terminal to install the virtual midi module:

    sudo modprobe snd-virmidi

    Use “aconnect -i” to list available inputs and aconnect -o to list available outputs. If the snd-virmidi module is working it should list a few VirMIDI ports and one called Mixxx.

    Use aconnect to link a midi port to mix. In my case Mixxx is 128 and I have one MIDI port with id 20 so I use:

    aconnect 20:0 128:0

    Now start FingerPlayServer and connect to it on your phone. It should list a lot of VirMIDI ports but pick the one matching the port you’ve connected to Mixxx. On my machine it’s “VirMIDI [hw:1,0,0]”

    Now try the MIDI learn function in Mixxx for your MIDI port and it should pick up the controller changes from the phone.


modprobe - program to add and remove modules from the Linux Kernel

$ fluidsynth -a alsa -l /home/joan/soundfonts/fluid-soundfont-3.1/FluidR3_GM.sf2

de moment res... el problema és que en el Android a mi no m'apareix tota la llista de virmidis. En el aconnectgui sí que m'apareix i el puc connectar al fluidsynth.

Solució

El més important és tenir la versió 0.8.0 del server. Aleshores instal.lo els virmidis, que reconeixerà l'aplicació client.

$ sudo modprobe snd-virmidi
$ aconnect -i -o

Arrenco el JACK, i arrenco el fluidsynth, com de costum:

$ fluidsynth -j -m alsa_seq -a jack -d /home/joan/soundfonts/AI-APiano02trans.sf2 

El fluidsynth l'arrenco amb l'opció -d per que m'ajudarà a entendre per què no acaba de funcionar.

Arrenco el servidor, que es posa a escoltar. Arrenco l'aplicació client, que la connecto al servidor. Selecciono el primer dels virmidis (1-0). En el JACK connecto aquest virmidi (Virtual RAW MIDI 1-0) al fluidsynth. Ja funciona, però se sent molt malament.

Es sent molt malament perquè en el fluidsynth veig que les notes que s'estan enviant amb el pad 3x3 són les notes que van de la 14 a la 29, quan el do central és el 60. Per tant, he de fer una regla de midi router en el fluidsynth que sumi 46 unitats de notes. Així doncs, la regla que he d'implementar en el fluidsynth (puc utilitzar un fitxer amb l'opció -f) és:

router_clear
router_begin note
router_par1 14 29 1 46
router_end

I ara sí que funciona. De moment, he probat el pad 3x3. Els altres controls envien altres tipus de missatges.

Important. Disposo del codi font per si vull modificar o recompilar. I això és el que faré en el projecte Proj17 (documentar de com s'importa aquest projecte en el Eclipse, i de com puc adaptar el codi).

Proj17-DroidMusic: Compilació i adaptació del FingerPlay

Vull compilar, adaptar i estudiar el FingerPlay. El projecte que començo és DroidMusic, i es correspon al projecte Java #Proj17.

Tots els .svn els puc eliminar.

Compilar el common

Els fitxers que vénen del svn no tenen permís d'escriptura:

$ sudo chmod a+w -R server/

El primer que s'ha de compilar (build all) és el common, que genera FingerPlayCommon.jar, que és el jar que necessita el server

         [jar] Building jar: /home/joan/workspace/Proj17/common/bin/FingerPlayCommon.jar
BUILD SUCCESSFUL
Total time: 510 milliseconds

Per compilar-lo he creat un nou projecte (File > New > Project, no fer New > Java Project), que es diu common. Aleshores, fer Build All i es crea el FingerPlayCommon.jar.

Ara que funciona, he de canviar el nom a aquest projecte, i en comptes de:

Torno a crear un projecte nou (common), el compilo i es torna a dir Proj17/common/bin/FingerPlayCommon.jar. Per tal de tenir el fitxer DroidMusicCommon.jar he de canviar els fitxers build.xml i .project:

		<jar destfile="bin/DroidMusicCommon.jar" basedir="build/" />

ara torno a compilar (faig Clear > Build the entire workspace), i ara sí:

Buildfile: /home/joan/workspace/Proj17/common/build.xml

jar:
         [jar] Building jar: /home/joan/workspace/Proj17/common/bin/DroidMusicCommon.jar
BUILD SUCCESSFUL
Total time: 284 milliseconds

Compilar el server

Així doncs, el primer que he de fer és copiar el DroidMusicCommon.jar que acabo de generar a /Proj17/server/libs.

També canvio el build.xml, el .project i el .classpath. Per exemple, build.xml queda:

<project default="jar">

	<!--

	<taskdef name="jsmoothgen"

	     classname="net.charabia.jsmoothgen.ant.JSmoothGen"

	     classpath="jsmooth/jsmoothgen-ant.jar"/>

	-->



	<target name="jar">

		<mkdir dir="bin/"/>

		<copy file="libs/DroidMusicCommon.jar" todir="bin/" />

        <jar destfile="bin/DroidMusicServer.jar" basedir="build/">

            <manifest>

                <attribute name="Main-Class" value="com.joanillo.droidmusic.DroidMusicServer" />

                <attribute name="Class-Path" value="DroidMusicCommon.jar" />

            </manifest>

        </jar>

		<!--

		<jsmoothgen project="jsmooth/jsmooth.jsmooth" skeletonroot="jsmooth/skeletons"/>

		-->

		<zip destfile="bin/DroidMusicServer.zip"

			basedir="bin/"

			excludes="*.zip,version.txt,*.exe"

		/>

	</target>



</project>

Abans de crear el projecte en el Eclipse i importar les fonts, faig els següents canvis:

Ja està ja funciona. Run as Java Application:

DroidMusicServer v0.8.0

Listening on 127.0.1.1:4444
Waiting for connection from phone..

Per executar-ho des de la línia de comandes:

java -jar DroidMusicServer.jar

Ara bé, aquest fitxer no el tinc per enlloc. Hauria d'estar dins de bin/. El que passa és que no fa cas del fitxer build.xml, no sé com es de dir-li que en el build faci cas a aquest fitxer (tot i que en el common sí que li fa cas).

Puc crear el jar manualment:

The basic format of the command for creating a JAR file is:

jar cf jar-file input-file(s)

És així de simple:

$ cd Proj17/server/bin
$ jar cvf DroidMusicServer.jar *

Ara bé, encara no va:

$ java -jar DroidMusicServer.jar

Failed to load Main-Class manifest attribute from
DroidMusicServer.jar

La manera correcta de fer-ho des de l'Eclipse és File > Export > JAVA > Runnable JAR File. A Export Destination fico: Proj17/server/bin/DroidMusicServer.jar

i ara sí que funciona:

$ cd /home/joan/workspace/Proj17/server/bin
$ java -jar DroidMusicServer.jar 

DroidMusicServer v0.8.0

Listening on 127.0.1.1:4444
Waiting for connection from phone..

Video

Transcripció català

Transcripció castellà

Transcripció anglès

Notes tècniques

Enllaços


creat per Joan Quintana Compte,

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