vmpk-0.4.0/0000755000175000001440000000000011572642326011530 5ustar pedrousersvmpk-0.4.0/translations/0000755000175000001440000000000011572642326014251 5ustar pedrousersvmpk-0.4.0/translations/vmpk_es.ts0000644000175000001440000032547211572642326016302 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Fecha de compilación: %2<br/>Hora de compilación: %3<br/>Compilador: %4</p></body></html> AboutClass About Acerca de <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008, Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program contains RtMIDI: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008, Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program contains RtMIDI: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Copyright © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program contains <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Copyright © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following copyright notice is also applicable:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program contains <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> DialogExtraControls New Control Nuevo controlador System Exclusive File Archivo de sistema exclusivo System Exclusive (*.syx) Sistema exclusivo (*.syx) Extra Controls Editor Editor de controles extras Label: Etiqueta: MIDI Controller: Controlador MIDI: Add Añadir Remove Eliminar Up Arriba Down Abajo Switch Conmutador Knob Botón rotatorio Spin box Valor giratorio Slider Deslizador Button Ctl Botón de Controlador Button SysEx Botón de SysEx Default ON Activado por omisión value ON: Valor activado: value OFF: Valor desactivado: Min. value: Valor mínimo: Max. value: Valor máximo: Default value: Valor por omisión: Display size: Tamaño visual: value: valor: File name: Nombre de archivo: ... ... KMapDialog Open... Abrir... Save As... Guardar como... Raw Key Map Editor Editor de teclado de bajo nivel Key Map Editor Editor de mapa de teclado Key Code Código de tecla Key Tecla Open keyboard map definition Abrir definición de mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Save keyboard map definition Guardar definición de mapa de teclado KMapDialogClass Key Map Editor Editor de mapa de teclado 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Tecla This box displays the name of the current mapping file Esta caja muestra el nombre del archivo actual de mapa de teclado This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Esta es la lista de conversión del teclado de PC. Cada fila tiene un número correspondiente al número de nota MIDI, y un área para introducir el nombre de una tecla que será traducida a dicha nota KeyboardMap File: %1 %2 Archivo: %1\n%2 Error loading a file Error abriendo un archivo Error saving a file Error guardando un archivo Error reading XML Error leyendo XML MidiSetupClass MIDI Setup Configuración MIDI Enable MIDI input Habilitar entrada MIDI Input MIDI Connection Conexión de entrada MIDI Output MIDI Connection Conexión de salida MIDI Enable MIDI Thru on MIDI Output Copiar la entrada MIDI en la salida Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Marque esta casilla para habilitar la entrada MIDI del programa. En Linux y Mac OSX el puerto de entrada está siempre habilitado, y no puede ser desmarcado Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Marque esta casilla para habilitar la función MIDI Thru: cualquier evento MIDI recibido en el puerto de entrada será copiado sin cambios al puerto de salida Use this control to change the connection for the MIDI input port, if it is enabled Utilice este control para cambiar la conexión del puerto de entrada MIDI, si está habilitado Use this control to change the connection for the MIDI output port Utilice este control para cambiar la conexión del puerto de salida MIDI PianoScene C Do C♯ Do♯ D Re D♯ Re♯ C# Do# D# Re# E Mi F Fa F# Fa# G# Sol# A# La# Db Reb Eb Mib Gb Solb Ab Lab Bb Sib F♯ Fa♯ G Sol G♯ Sol♯ A La A♯ La♯ B Si D♭ Re♭ E♭ Mi♭ G♭ Sol♭ A♭ La♭ B♭ Si♭ Preferences Open instruments definition Abrir definición de instrumentos Instrument definitions (*.ins) Definición de instrumentos (*.ins) Open keyboard map definition Abrir definición de mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) PreferencesClass Preferences Preferencias Input Channel Canal de Entrada Output Channel Canal de Salida Velocity Velocidad Base octave Octava base Number of octaves Número de octavas Key pressed color Color de teclas pulsadas color... color... Instruments file Archivo de instrumentos default por omisión load... abrir... Instrument Instrumento Grab keyboard Capturar teclado Styled Knobs Aplicar estilos The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. El número de octavas, de 1 a 10. Cada octava tiene 12 teclas: 7 blancas y 5 negras. El estándar MIDI tiene 128 notas, pero no todos los instrumentos pueden reproducirlas todas. This box displays the highligh color and code used to paint the keys that are being activated. Esta caja muestra el color de resaltado y el código utilizado para pintar las teclas activadas. Press this button to change the highligh color used to paint the keys that are being activated. Pulse este botón para cambiar el color de resaltado utilizado para pintar las teclas activadas. The instruments definition file currently loaded El archivo de definición de instrumentos actualmente seleccionado Press this button to load an instruments definition file from disk. Pulse este botón para leer un archivo de definición de instrumentos desde el disco Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Cambie la definición de instrumento seleccionada actualmente. Cada archivo de definición de instrumentos puede contener varias. Keyboard Map Mapa de teclado Load... Abrir... Raw Keyboard Map Mapa de teclado de bajo nivel Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Cambie el estilo de los controles, bién usando el aspecto personalizado o volviendo al estilo seleccionado en qtconfig Styled Widgets Aplicar estilos <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Marque esta casilla para seleccionar los eventos de teclado de bajo nivel. Esto tiene varias ventajas:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es posible usar "teclas muertas" (acentos, diacríticos)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Las definiciones de mapas son independientes del lenguage (pero dependientes del hardware/sistema operativo)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceso más rápido</li></ul></body></html> Drums Channel Canal de percusión None Ninguno 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Translate MIDI velocity to key pressed color tint Convertir velocidad MIDI en matiz de color de las teclas activadas Network Port Puerto de red Change the knob buttons style, either using the custom look or revert to the style selected in qtconfig. Cambie el estilo de los controles, o bién usando el aspecto personalizado o volviendo al estilo seleccionado en qtconfig Check this box to keep the keyboard window always visible, on top of other windows. Marque esta casilla para que la ventana del teclado permanezca siempre visible, sobre las otras ventanas. Always On Top Siempre visible <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Marque esta casilla para capturar el teclado de PC, aun cuando el control de teclado no tenga el foco. <span style=" font-weight:600;">Nota para usuarios de Linux:</span> esta opción funciona correctamente en escritorios KDE, pero falla en gestores de ventanas como metacity y compiz. También se sabe que esta opción interfiere con los menús desplegables de las aplicaciones basadas en GTK.</p></body></html> Grab Computer Keyboard Capturar el teclado del ordenador <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster process</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Marque esta casilla para selección el teclado de bajo nivel. Esto tiene varias ventajas:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es posible usar "teclas muertas" (acentos, diacríticos)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Las definiciones de mapas son independientes del lenguage (pero dependientes del hardware/sistema operativo)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceso más rápido</li></ul></body></html> Raw Computer Keyboard Teclado de bajo nivel Check this box to display the note names over the piano keys. Marque esta casilla para mostrar los nombres de las notas sobre las teclas del piano Show Note Names Mostrar nombres de notas QObject Cakewalk Instrument Definition File Archivo de Definición de Instrumento de Cakewalk File Archivo Date Fecha RiffImportDlg Input SoundFont SoundFont de origen SoundFonts (*.sf2 *.sbk *.dls) Output Salida Instrument File (*.ins) Definición de instrumentos (*.ins) Import Sound Font instruments Importar instrumentos de SoundFonts Input File Archivo de entrada This text box displays the path and name of the selected Sound Font to be imported Esta cada muestra la ruta y el nombre del archivo SoundFont seleccionado que va a ser importado Press this button to select a Sound Font file to be imported Pulse este botón para seleccionar un archivo SoundFont para ser importado ... Name Nombre Version Versión Copyright Output File Archivo de salida This text box displays the name of the output file in .INS format that will be created Esta caja muestra el nombre del archivo de salida en formato .INS que será creado Press this button to select a path and file name for the output file Pulse este botón para seleccionar un camino y un nombre de archivo de salida Instrument definitions (*.ins) Definición de instrumentos (*.ins) Import SoundFont instruments Importar instrumentos de SoundFonts This text box displays the path and name of the selected SoundFont to be imported Esta caja muestra la ruta y el nombre del archivo SoundFont seleccionado que va a ser importado Press this button to select a SoundFont file to be imported Pulse este botón para seleccionar un archivo SoundFont para ser importado ShortcutDialog Keyboard Shortcuts Atajos de teclado Action Acción Description Descripción Shortcut Atajo Warning Atención Keyboard shortcuts have been changed. Do you want to apply the changes? Los atajos de teclado han cambiado. ¿Desea conservar los cambios? VPiano Error Error No MIDI output ports available. Aborting No existen puertos MIDI de salida. Abortar Error. Aborting Error. Abortar Chan: Can: Channel: Canal: Oct: Oct: Base Octave: Octava base: Trans: Trans: Transpose: Transposición: Vel: Vel: Velocity: Velocidad: Control: Control: Value: Valor: Bender: Inflexión: Bank: Banco: Program: Programa: The language for this application is going to change to %1. Do you want to continue? El idioma de esta aplicación está a punto de cambiar a %1. ¿Deseas continuar? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK está desarrollado y traducido gracias al trabajo voluntario de mucha gente de todo el mundo. Si quieres unirte al equipo o tienes cualquier pregunta, por favor visita los foros en <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Información sobre traducción Swedish Sueco Translation Traducción <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Traductor: Pedro López-Cabanillas &lt;plcl@users.sf.net&gt;</p>%1 Czech checo German alemán English inglés Spanish español French francés Dutch Holandés Russian ruso Turkish turco Chinese chino Language Changed Idioma modificado The language for this application has been changed. The change will take effect the next time the application is started. El idioma para esta aplicación ha cambiado. Los cambios tendrán efecto la próxima vez que el programa sea iniciado. Channel: Canal: Base Octave: Octava base: Transpose: Transposición: Velocity: Velocidad: Control: Control: Value: Valor: Bender: Inflexión: Bank: Banco: Program: Programa: Open keyboard map definition Abrir definición de mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Save keyboard map definition Guardar definición de mapa de teclado Virtual Piano Keyboard Teclado de Piano Virtual &File &Archivo &Edit &Edición Keyboard map Mapa de teclado &Help A&yuda &Language &Idioma &View &Ver &Tools &Herramientas Notes Notas Controllers Controladores Programs Programas &Notes &Notas &Controllers &Controladores Pitch &Bender &Inflexión de tono &Programs &Programas &Extra Controls Controles &Extra &Quit &Terminar Exit the program Terminar el programa &Preferences &Preferencias Edit the program settings Editar los ajustes del programa &Connections &Conexiones Edit the MIDI connections Editar las conexiones MIDI &About &Acerca de Show the About box Mostrar el cuadro Acerca De About &Qt Acerca de &Qt Next Channel Siguiente Canal Play and listen next channel Ejecutar y reproducir en el siguiente canal Previous Channel Canal anterior Play and listen previous channel Ejecutar y reproducir en el canal anterior About Q&t Acerca de Q&t Show the Qt about box Mostrar el cuadro Acerca de Qt Show or hide the Notes toolbar Mostraru ocultar la barra de herramientas de Notas Show or hide the Controller toolbar Mostrar u ocultar la barra de herramientas de Controladores Show or hide the Pitch Bender toolbar Mostrar u ocultar la barra de herramientas de Inflexión de Tono Show or hide the Programs toolbar Mostrar u ocultar la barra de herramientas de Programas &Status Bar Barra de &Estado Show or hide the Status Bar Mostrar u ocultar la barra de estado Panic Pánico Stops all active notes Detiene todas las notas activas Reset All Restablecer Resets all the controllers Restablece el valor de todos los controladores Reset Restablecer Resets the Bender value Restablece el valor de la Inflexión Import SoundFont Importar SoundFont Show or hide the Extra Controls toolbar Mostrar u ocultar la barra de herramientas de controles extra Edit Editar Open the Extra Controls editor Abrir el editor de controles extra Open the Banks/Programs editor Abrir el editor de bancos/programas &Extra Controllers Controles extra N&ote Names N&ombres de notas Show or hide the note names Mostrar u ocultar los nombres de las notas &Shortcuts &Atajos Open the Shortcuts editor Abrir el editor de atajos Octave Up Octava alta Play one octave higher Ejecutar una octava superior Octave Down Octava inferior Play one octave lower Ejecutar en una octava inferior Transpose Up Transporte ascendente Transpose one semitone higher Transportar un semitono superior Transpose Down Transporte descendente Transpose one semitone lower Transportar un semitono inferior About &Translation Acerca de la &traducción Show information about the program language translation Mostrar información acerca de la traducción del programa Channel Up Canal siguiente Play and listen one channel higher Ejecutar y reproducir en el canal siguiente Next Controller Siguiente controlador Select the next controller Seleccionar el controlador siguiente Previous Controller Controlador anterior Select the previous controller Seleccionar el controlador anterior Controller Up Incrementar controlador Increment the controller value Incrementar el valor del controlador Controller Down Decrementar controlador Decrement the controller value Decrementar el valor del controlador Next Bank Banco siguiente Select the next instrument bank Seleccionar el siguiente banco de instrumentos Previous Bank Banco anterior Select the previous instrument bank Seleccionar el anterior banco de instrumentos Next Program Siguiente programa Select the next instrument program Seleccionar el siguiente programa de instrumento Previous Program Programa anterior Select the previous instrument program Seleccionar el anterior programa de instrumentos Velocity Up Incrementar velocidad Increment note velocity Incrementar la velocidad de las notas Velocity Down Decrementar velocidad Decrement note velocity Decrementar la velocidad de las notas Load... Abrir... Load another keyboard layout Abrir otra disposición de teclado Save... Guardar... Save the current keyboard layout Guardar la disposición de teclado actual &Keyboard Map Mapa de teclado Edit... Editar... Edit the current keyboard layout Edita la disposición de teclado actual &Contents &Contenido Open the index of the help document Abrir el índice del documento de ayuda VMPK &Web site Sitio &Web de VMPK Open the VMPK web site address using a web browser Abrir la direción del sitio web de VMPK usando un navegador &Import SoundFont... &Importar SoundFont No help file found No se ha encontrado un archivo de ayuda vmpk-0.4.0/translations/CMakeLists.txt0000644000175000001440000000103711572642326017012 0ustar pedrousers# unmaintained translations, not installed # vmpk_tr.ts SET( TRANSLATIONS_FILES vmpk_cs.ts vmpk_de.ts vmpk_es.ts vmpk_fr.ts vmpk_nl.ts vmpk_ru.ts vmpk_sv.ts vmpk_zh_CN.ts ) QT4_ADD_TRANSLATION(QM_FILES ${TRANSLATIONS_FILES}) ADD_CUSTOM_TARGET(translations ALL DEPENDS ${QM_FILES}) IF (UNIX AND NOT APPLE) INSTALL( FILES ${QM_FILES} DESTINATION share/vmpk/locale ) ELSE (UNIX AND NOT APPLE) INSTALL( FILES ${QM_FILES} DESTINATION . ) ENDIF (UNIX AND NOT APPLE) vmpk-0.4.0/translations/vmpk_fr.ts0000644000175000001440000031042711572642326016274 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> AboutClass About A propos <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou modifier sous les conditions de la License Publique Générale GNU (GPL) telle que publiée par la Free Software Foundation, en la version 3 de la License, ou (à votre choix) en toute version ultérieure.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est disribué dans l'espoir d'être utile, mais SANS GARANTIE AUCUNE, et particulièrement SANS garantie implicite de VALEUR COMMERCIALE ou d'UTILITE A QUELCONQUE APPLICATION. Consultez la License Publique Générale GNU (GPL) pour plus de précisions. Vous devez avoir reçu une copie de la License Publique Générale GNU (GPL) avec ce programme. Si ce n'est pas le cas, consultez </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">La notice de copyright suivante est également applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme contient des classes C++</span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> {3C?} {4.0/?} {3.?} {40/?} {1"?} {10p?} {400;?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {2008-2011,?} {9p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {3 ?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {2003-2010 ?} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou modifier sous les conditions de la License Publique Générale GNU (GPL) telle que publiée par la Free Software Foundation, en la version 3 de la License, ou (à votre choix) en toute version ultérieure.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme est disribué dans l'espoir d'être utile, mais SANS GARANTIE AUCUNE, et particulièrement SANS garantie implicite de VALEUR COMMERCIALE ou d'UTILITE A QUELCONQUE APPLICATION. Consultez la License Publique Générale GNU (GPL) pour plus de précisions. Vous devez avoir reçu une copie de la License Publique Générale GNU (GPL) avec ce programme. Si ce n'est pas le cas, consultez </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">La notice de copyright suivante est également applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ce programme contient des classes C++</span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> DialogExtraControls New Control Nouveau contrôleur System Exclusive File Fichier System Exclusive System Exclusive (*.syx) Extra Controls Editor Editeur des contrôles supplémentaires Label: Etiquette: MIDI Controller: Contrôleur MIDI: Add Ajouter Remove Supprimer Up Monter Down Descendre Switch Commutateur Knob Bouton rotatif Spin box Slider Réglette Button Ctl Bouton d'envoi contrôleur Button SysEx Bouton d'envoi SysEx Default ON Par défaut: ON value ON: valeur ON: value OFF: valeur OFF: Min. value: Valeur min: Max. value: Valeur max: Default value: Valeur par défaut: Display size: Taille d'affichage: value: valeur: File name: Nom du fichier à envoyer: ... KMapDialog Open... Ouvrir... Save As... Enregistrer sous... Raw Key Map Editor Editeur de données brutes de touches Key Map Editor Editeur d'attribution des touches Key Code Code clavier Key Touche Open keyboard map definition Ouvrir un fichier de définitions clavier Keyboard map (*.xml) Fichier de définitions clavier (*.xml) Save keyboard map definition Enregistrer les définitions clavier KMapDialogClass Key Map Editor Editeur d'attribution des touches This box displays the name of the current mapping file Cette boîte indique le nom du fichier d'attribution actuel This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Ceci est la liste des attributions du clavier du PC. Chaque ligne possède un numéro correspondant au numéro de la note MIDI, on peut entrer un nom alphanumérique qui sera transformé en la note donnée 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Touche KeyboardMap Error loading a file Erreur lors de la lecture du fichier Error saving a file Erreur lors de l'enregistrement du fichier Error reading XML Erreur lors de la lecture du XML File: %1 %2 Fichier: %1 %2 MidiSetupClass MIDI Setup Paramètres MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Cocher cette case pour activer l'entrée MIDI du logiciel. Sous Linux et MacOSX le port d'entrée est toujours activé et ne peut pas être décoché Enable MIDI input Activer l'entrée MIDI Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Cocher cette case pour activer la fonction MIDI Thru: tous les évênements MIDI reçus sur le port d'entrée seront copiés vers le port de sortie Enable MIDI Thru on MIDI Output Activer MIDI Thru Input MIDI Connection Connexion du port d'entrée Use this control to change the connection for the MIDI input port, if it is enabled Ici vous pouvez établir et changer la connexion du port MIDI d'entrée s'il est activé Output MIDI Connection Connexion du port de sortie Use this control to change the connection for the MIDI output port Ici vous pouvez établir et changer la connexion du port MIDI de sortie PianoScene C Do C♯ Do♯ D Re D♯ Re♯ C# Do# D# Re# E Mi F Fa F# Fa# G# Sol# A# La# Db Reb Eb Mib Gb Solb Ab Solb Bb Bb F♯ Fa♯ G Sol G♯ Sol♯ A La A♯ La♯ B Si D♭ Re♭ E♭ Mi♭ G♭ Sol♭ A♭ La♭ B♭ Si♭ Preferences Open instruments definition Ouvrir un fichier de définition d'instrument Instrument definitions (*.ins) Définition d'instrument (*.ins) Open keyboard map definition Ouvrir un fichier d'attribution clavier Keyboard map (*.xml) Fichier d'attribution clavier (*.xml) PreferencesClass Preferences Préférences Number of octaves Nombre d'octaves The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Le nombre d'octaves de 1 à 10. Chaque octave a 12 touches, 7 blanches et 5 noires. Le standard MIDI a 128 notes, mais la plupart des instruments ne peuvent pas toutes les jouer. Key pressed color Couleur des touches appuyées This box displays the highligh color and code used to paint the keys that are being activated. Diese Auswahl zeigt die Markierungsfarbe und den Farbcode die zum zeichnen gedrückter Tasten benutzt werden soll. Press this button to change the highligh color used to paint the keys that are being activated. Appuyer ici pour changer la couleur de contraste pour les touches jouées. color... Modifier... Instruments file Définition d'instrument The instruments definition file currently loaded Le fichier de définition d'instrument actuellement chargé default Standard Press this button to load an instruments definition file from disk. Appuyer ici pour ouvrir un fichier de définition d'instrument. load... Ouvrir... Instrument Instrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Changer la définition d'instrument actuelle. Chaque fichier peut contenir plusieurs instruments. Keyboard Map Attribution clavier Load... Ouvrir... Raw Keyboard Map There is no good/short way to translate this to german :-/ Attribution clavier - brut Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Changer le style graphique des éléments de contrôle (boutons rotatifs et commutateurs), soit le style propre de VMPK ou le style prédéfini dans qtconfig. Styled Widgets Style propre pour les contrôles <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cocher cette case pour utiliser les évênements brutes du clavier PC. Ce système a plusieurs avantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Il est possible d'utiliser les touches de modification (accents, touches de contrôle)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les définitions d'attribution sont indépendantes de la langue mais pas du système d'exploitation et du matériel</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Traitement plus rapide</li></ul></body></html> Drums Channel Canal de Batterie None Aucun 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Translate MIDI velocity to key pressed color tint Traduire la vélocité MIDI à la couleur des touches Network Port Port Réseau Change the knob buttons style, either using the custom look or revert to the style selected in qtconfig. Mit dieser Option kann man das Aussehen der Knöpfe verändern; entweder der eigene Stil oder das Standardaussehen. Styled Knobs Stylische Knöpfe Check this box to keep the keyboard window always visible, on top of other windows. Cocher cette option pour garder la fenêtre du clavier toujours visible devant toutes les autres fenêtres. Always On Top Rester au premier plan <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cocher cette option pour capturer le clavier de l'ordinateur même si vmpk n'est pas l'application actuellement dans le focus<span style=" font-weight:600;">Note pour les utilisateurs linux:</span>Cette option fonctionne bien sous KDE, mais échoue dans des gestionnaires de fenêtres comme metacity ou compiz. Elle mêne également au dysfonctionnement des menus déroulants d'applications GTK.</p></body></html> Grab Computer Keyboard Capturer le clavier d'ordinateur Raw Computer Keyboard Données brutes du clavier Grab keyboard Tastatur einfangen Check this box to display the note names over the piano keys. Cette option affiche les noms des notes sur les touches du piano. Show Note Names Afficher les noms des notes QObject Cakewalk Instrument Definition File Fichier de définition d'instrument Cakewalk File Fichier Date RiffImportDlg Input SoundFont Entrée (SoundFont) SoundFonts (*.sf2 *.sbk *.dls) Fichiers SoundFont (*.sf2 *.sbk *.dls) Output Sortie Instrument definitions (*.ins) Définitions d'instrument (*.ins) Import SoundFont instruments Importer des instruments SoundFont Input File Fichier d'entrée This text box displays the path and name of the selected SoundFont to be imported Le chemin et le nom du fichier SoundFont à importer Press this button to select a SoundFont file to be imported Appuyer ici pour sélectionner un fichier SoundFont à importer ... Name Nom Version Copyright Output File Fichier de sortie This text box displays the name of the output file in .INS format that will be created Le nom du fichier de sortie au format .INS à créer Press this button to select a path and file name for the output file Appuyer ici pour choisir le nom du fichier de sortie et son chemin ShortcutDialog Keyboard Shortcuts Raccourcis Clavier Action Description Déscription Shortcut Raccourci Warning Avertissement Keyboard shortcuts have been changed. Do you want to apply the changes? Les raccourcis clavier ont été modifiés Voulez-vous appliquer ces modifications? VPiano Error Erreur No MIDI output ports available. Aborting Aucun port de sortie MIDI disponible. Abandon Error. Aborting Erreur. Abandon Chan: Can: Channel: Canal: Oct: Base Octave: Octave de base: Trans: Transpose: Transposer: Vel: Vél: Velocity: Vélocité: Control: Contrôle: Value: Valeur: Bender: Pitchbend: Bank: Banque: Program: Programme: The language for this application is going to change to %1. Do you want to continue? La langue de cette application va changer à %1. Voulez-vous continuer? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK est développé et traduit grâce au travail volontaire fourni par de nombreuses personnes du monde entier. Si vous souhaitez rejoindre l'équipe ou si vous avez d'autres questions, n'hésitez pas à rejoindre les forums sur <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Informations sur la traduction Swedish Suédois Translation Traduction <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Traduit par Frank Kober (emuse@users.sourceforge.net)</p>%1 Czech Tchèque German Allemand English Anglais Spanish Espagnol French Français Dutch Hollandais Russian Russe Turkish Turque Chinese Chinois Language Changed La langue a changé Channel: Kanal: Base Octave: Basisoktave: Transpose: Transponieren: Velocity: Geschwindigkeit: Control: Kontrolle: Value: Wert: Program: Programm: Open keyboard map definition Öffne Tastaturbelegungsdatei Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Save keyboard map definition Speichere Tastaturbelegung No help file found Impossible de trouver un fichier d'aide Virtual Piano Keyboard Clavier Piano Virtuel &File &Fichier &Edit &Editer Keyboard map Tastaturbelegung &Help &Aide &Language &Langue &View &Affichage &Tools &Outils Notes Controllers Contrôleurs Programs Programmes &Notes &Controllers &Contrôleurs Pitch &Bender &Programs &Programmes &Extra Controls &Contrôles supplémentaires &Quit &Quitter Exit the program Terminer ce logiciel &Preferences &Préférences Edit the program settings Modifier les préférences du logiciel &Connections &Connexions MIDI Edit the MIDI connections Modifier les connexions MIDI &About &A propos Show the About box Afficher les informations sur ce logiciel About Q&t A propos de Q&t About &Qt A propos de &Qt Show the Qt about box Afficher la boîte d'information Qt Show or hide the Notes toolbar Afficher ou cacher la barre d'outils Notes Show or hide the Controller toolbar Afficher ou cacher la barre d'outils Contrôles Show or hide the Pitch Bender toolbar Afficher ou cacher la barre d'outils Pitchbend Show or hide the Programs toolbar Afficher ou cacher la barre d'outils Programmes &Status Bar &Ligne statut Show or hide the Status Bar Afficher ou cacher la Barre d'Etat Panic Panique Stops all active notes Arrête toutes les notes actives Esc Echap Reset All Tout réinitialiser Resets all the controllers Réinitialise tous les contrôleurs Reset Réinitialiser Resets the Bender value Réinitialise le pitchbend Import SoundFont Importer un SoundFont Show or hide the Extra Controls toolbar Afficher ou cacher la Barre d'outils de contrôles supplémentaires Edit Editer Open the Extra Controls editor Ouvrir l'éditeur des contrôles supplémentaires Open the Banks/Programs editor Affiche l'éditeur des banques et programmes &Extra Controllers Contrôleurs s&upplémentaires N&ote Names Noms des n&otes Show or hide the note names Afficher ou cacher les noms des notes &Shortcuts &Raccourcis Open the Shortcuts editor Ouvrir l'éditeur des raccourcis Octave Up Octave + Play one octave higher Jouer une octave plus haut Right Droite Octave Down Octave - Play one octave lower Jouer une octave plus bas Left Gauche Transpose Up Transposer + Transpose one semitone higher Transposer vers le haut d'une demi note Ctrl+Right Ctrl+Droite Transpose Down Transposer - Transpose one semitone lower Transposer vers le bas d'une demi note Ctrl+Left Ctrl+Gauche Next Channel Canal suivant Play and listen next channel Jouer et écouter sur le canal suivant Previous Channel Canal précédent Play and listen previous channel Jouer et écouter sur le canal précédent About &Translation A propos de la &Traduction Show information about the program language translation Informations sur la traduction linguistique du programme Up Monter Down Descendre Next Controller Contrôleur suivant Select the next controller Sélectionner le contrôleur suivant Previous Controller Contrôleur précédent Select the previous controller Sélectionner le contrôleur précédent Controller Up Contrôleur + Increment the controller value Incrémenter la valeur du contrôleur Controller Down Contrôleur - Decrement the controller value Décrémenter la valeur du contrôleur Next Bank Banque suivante Select the next instrument bank Sélectionner la banque d'instruments suivante Previous Bank Banque précédente Select the previous instrument bank Sélectionner la banque d'instruments précédente Next Program Programme suivant Select the next instrument program Sélectionner le programme d'instrument suivant Previous Program Programme précédent Select the previous instrument program Sélectionner le programme d'instrument précédent Velocity Up Vélocité + Increment note velocity Incrémenter la vélocité de note End Fin Velocity Down Vélocité - Decrement note velocity Décrémenter la vélocité de note Load... Laden... Load another keyboard layout Lade eine andere Tastaturbelegung Save... Speichern... Save the current keyboard layout Speichere die aktuelle Tastaturbelegung &Keyboard Map &Attribution des touches Edit... Bearbeiten... Edit the current keyboard layout Editer les attributions des touches actuels &Contents &Sommaire Open the index of the help document Ouvrir le sommaire du document d'aide VMPK &Web site Se connecter au site &web VMPK Open the VMPK web site address using a web browser Ouvrir l'adresse du site web VMPK dans un navigateur internet &Import SoundFont... &Importer un SoundFont... vmpk-0.4.0/translations/vmpk_nl.ts0000644000175000001440000025230711572642326016300 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Versie: %1<br/>Build-datum: %2<br/>Build-tijd: %3<br/>Compiler: %4</p></body></html> AboutClass About Over <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> DialogExtraControls Extra Controls Editor Extra controls Label: Label: MIDI Controller: MIDI-controller: Add Toevoegen Remove Verwijderen Up Omhoog Down Omlaag Switch Schakelaar Knob Draaiknop Spin box Spinbox Slider Schuifknop Button Ctl Knop Ctl Button SysEx Knop SysEx Default ON Standaard AAN value ON: Waarde AAN: value OFF: Waarde UIT: Min. value: Min. waarde: Max. value: Max. waarde: Default value: Standaardwaarde: Display size: Weergavegrootte: value: waarde: File name: Bestandsnaam: ... ... New Control Nieuwe control System Exclusive File System Exclusive-bestand System Exclusive (*.syx) KMapDialog Open... Openen... Save As... Opslaan als... Raw Key Map Editor Raw-toetsentoewijzingseditor Key Map Editor Toetsentoewijzingseditor Key Code Toetscode Key Toets Open keyboard map definition Definitie toetsenbordtoewijzing openen Keyboard map (*.xml) Toetsenbordtoewijzing (*.xml) Save keyboard map definition Definitie toetsenbordtoewijzing opslaan KMapDialogClass Key Map Editor Toetstoewijzingseditor This box displays the name of the current mapping file Dit veld geeft de naam van het huidige toewijzingsbestand weer This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Dit is de lijst van PC-toetsenbordtoewijzingen. Elke rij bevat een getal dat met het MIDI-nootnummer correspondeert; u kunt een alfanumerieke toetsnaam typen die zal worden vertaald naar de bijbehorende noot 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Toets KeyboardMap Error loading a file Fout bij het laden van een bestand Error saving a file Fout bij het opslaan van een bestand Error reading XML Fout tijdens het lezen van XML File: %1 %2 Bestand: %1 %2 MidiSetupClass MIDI Setup MIDI-instellingen Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Vink dit vakje aan om MIDI-invoer te activeren. In Linux en Mac OSX is de ingangspoort altijd geactiveerd en is dan altijd aangevinkt Enable MIDI input Activeer MIDI-ingang Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Vink dit vakje aan om MIDI-thru te activeren: alle ontvangen MIDI-events worden dan ongewijzigd doorgestuurd naar de uitgangspoort Enable MIDI Thru on MIDI Output Activeer MIDI-thru op MIDI-uitgang Input MIDI Connection Verbinding voor MIDI-ingang Use this control to change the connection for the MIDI input port, if it is enabled Kies hier de verbinding voor de MIDI-ingang, indien die actief is Output MIDI Connection Verbinding voor MIDI-uitgang Use this control to change the connection for the MIDI output port Kies hier de verbinding voor de MIDI-uitgangspoort PianoScene C D C# D# E F F# G# A# Db Eb Gb Ab Bb G A B Preferences Open instruments definition Instrumentendefinitie openen Instrument definitions (*.ins) Instrumentendefinities (*.ins) Open keyboard map definition Open een toetsenbordtoewijzings-definitie Keyboard map (*.xml) Toetsenbordtoewijzing (*.xml) PreferencesClass Preferences Voorkeuren Number of octaves Aantal octaven The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Het aantal octaven, van 1 tot 10. Elk octaaf heeft 12 toetsen: 7 witte en 5 zwarte. De MIDI-standaard heeft 128 noten, maar niet alle instrumenten kunnen ze allemaal afspelen. Key pressed color Kleur van aangeslagen toetsen This box displays the highligh color and code used to paint the keys that are being activated. Dit veld geeft de highlightkleur en code weer van toetsen die worden geactiveerd. Press this button to change the highligh color used to paint the keys that are being activated. Klik op deze knop om de highlightkleur te veranderen van toetsen die worden geactiveerd. color... kleur... Instruments file Instrumentenbestand The instruments definition file currently loaded Het instrumentendefinitiebestand dat momenteel geladen is default standaard Press this button to load an instruments definition file from disk. Klik op deze knop om een instrumentdefinitie-bestand van de harde schijf te laden. load... laden... Instrument Instrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Wijzig de instrumentdefinitie die momenteel in gebruik is. Ieder instrumentdefinitie-bestand kan meerdere instrumenten bevatten. Keyboard Map Toetsenbordtoewijzing Load... laden... Raw Keyboard Map Raw-toetsenbordtoewijzing Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Verander de widgetstijl (knoppen, schakelaars) door middel van het aangepaste uiterlijk of door terug te keren naar de stijl die is geselecteerd in qtconfig. Styled Widgets Gestylede widgets Check this box to keep the keyboard window always visible, on top of other windows. Vink dit vakje aan om het toetsenbordvenster altijd zichtbaar en boven andere vensters te houden. Always On Top Altijd op de voorgrond <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vink dit vakje aan om het PC-toetsenbord te over te nemen, ook wanneer de toetsenbordbesturing geen focus heeft. <span style=" font-weight:600;">Opmerking voor Linuxgebruikers:</span> deze optie werkt naar behoren in KDE-desktops, maar niet in window managers zoals metacity en compiz. Ook is het bekend dat drop down-menu's in GTK-applicaties niet meer werken wanneer deze optie gebruikt wordt.</p></body></html> Grab Computer Keyboard Neem het computertoetsenbord over <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vink dit vakje aan om low-level PC-toetsenbordevents te gebruiken. Dit systeem heeft een aantal voordelen:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het is mogelijk om "dode toetsen" te gebruiken (accentmarkeringen, diakritische tekens)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toewijzingsdefinities zijn onafhankelijk van de taal (maar hardware- en OS-specifiek)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Snellere verwerking</li></ul></body></html> Raw Computer Keyboard Raw-computertoetsenbord Drums Channel Drums-kanaal None Geen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Translate MIDI velocity to key pressed color tint Gebruik de MIDI-aanslagsnelheid om de kleurtint van aangeslagen toetsen te bepalen Network Port QObject Cakewalk Instrument Definition File Cakewalk instrumentdefinitiebestand File Bestand Date Datum RiffImportDlg Import SoundFont instruments Importeer SoundFont-instrumenten Input File Invoerbestand This text box displays the path and name of the selected SoundFont to be imported Dit tekstveld geeft pad en bestandsnaam weer van het SoundFont dat geïmporteerd moet worden Press this button to select a SoundFont file to be imported Klik op deze knop om een te importeren SoundFont-bestand te kiezen ... ... Name Naam Version Versie Copyright Copyright Output File Uitvoerbestand This text box displays the name of the output file in .INS format that will be created Dit tekstveld geeft de naam van het uitvoerbestand in .INS-formaat weer dat gecreëerd zal worden Press this button to select a path and file name for the output file Klik op deze knop om een pad en bestandsnaam voor het uitvoerbestand te kiezen Input SoundFont Invoer-SoundFont SoundFonts (*.sf2 *.sbk *.dls) Output Uitvoer Instrument definitions (*.ins) Instrumentdefinities (*.ins) ShortcutDialog Keyboard Shortcuts Sneltoetsen Action Actie Description Beschrijving Shortcut Sneltoetsen Warning Waarschuwing Keyboard shortcuts have been changed. Do you want to apply the changes? De sneltoetsen zijn gewijzigd. Wilt u de wijzigingen toepassen? VPiano &File &Bestand &Edit &Bewerken &Help &Help &Language &Taal &View &Beeld &Tools &Gereedschappen Notes Noten Controllers Programs Programma's &Notes &Noten &Controllers Pitch &Bender &Programs &Programma's &Extra Controls &Extra controls &Quit &Afsluiten Exit the program Het programma verlaten &Preferences &Voorkeuren Edit the program settings De programma-instellingen bewerken &Connections &MIDI-verbindingen Edit the MIDI connections Bewerk de MIDI-verbindingen &About &Over VMPK Show the About box Geef het 'Over VMPK'-venster weer About &Qt Over &Qt Show the Qt about box Geef het Qt-informatievenster weer Show or hide the Notes toolbar Toon of verberg de notenwerkbalk Show or hide the Controller toolbar Toon of verberg de controllerwerkbalk Show or hide the Pitch Bender toolbar Toon of verberg de pitch-benderwerkbalk Show or hide the Programs toolbar Toon of verberg de programmawerkbalk &Status Bar &Statusbalk Show or hide the Status Bar Toon of verberg de statusbalk Panic Stops all active notes Stopt alle actieve noten Reset All Reset alles Resets all the controllers Reset alle controllers Reset Reset Resets the Bender value Reset de pitch-benderwaarde &Keyboard Map &Toetsenbordtoewijzingen Edit the current keyboard layout Bewerk de huidige toetsenbordlayout &Contents &Inhoud Open the index of the help document Open de index van het helpdocument VMPK &Web site VMPK &Website Open the VMPK web site address using a web browser Open de VMPK-website in een webbrowser &Import SoundFont... &Importeer SoundFont... Import SoundFont Importeer een SoundFont Show or hide the Extra Controls toolbar Toon of verberg de extra controls-editor Edit Bewerk Open the Extra Controls editor Open de extra controls-editor Open the Banks/Programs editor Open de editor voor MIDI-banken/-programma's &Extra Controllers &Extra controllers N&ote Names N&otennamen Show or hide the note names Toon of verberg de notennamen &Shortcuts &Sneltoetsen Open the Shortcuts editor Open de sneltoetseneditor Octave Up Octaaf omhoog Play one octave higher Speel een octaaf hoger af Right Rechts Octave Down Octaaf omlaag Play one octave lower Speel een octaaf lager af Left Links Transpose Up Transponeer omhoog Transpose one semitone higher Transponeer een halve noot omhoog Ctrl+Right Ctrl+Rechts Transpose Down Transponeer omlaag Transpose one semitone lower Transponeer een halve noot omlaag Ctrl+Left Ctrl+Links Next Channel Volgende kanaal Play and listen next channel Speel en beluister het volgende kanaal Up Omhoog Previous Channel Vorige kanaal Play and listen previous channel Speel en beluister het vorige kanaal Down Omlaag Next Controller Volgende controller Select the next controller Selecteer de volgende controller Previous Controller Vorige controller Select the previous controller Selecteer de vorige controller Controller Up Verhoog controllerwaarde Increment the controller value Incrementeer de controllerwaarde Controller Down Verlaag controllerwaarde Decrement the controller value Decrementeer de controllerwaarde Next Bank Volgende bank Select the next instrument bank Selecteer de volgende instrumentenbank Previous Bank Vorige bank Select the previous instrument bank Selecteer de vorige instrumentenbank Next Program Volgende programma Select the next instrument program Selecteer het volgende instrumentprogramma Previous Program Vorige programma Select the previous instrument program Selecteer het vorige instrumentprogramma Velocity Up Verhoog aanslagsnelheid Increment note velocity Incrementeer de aanslagsnelheid van noten Velocity Down Verlaag aanslagsnelheid Decrement note velocity Decrementeer de aanslagsnelheid van noten About &Translation Over de &vertaling Show information about the program language translation Geef informatie over de programmavertaling weer Error Fout No MIDI output ports available. Aborting IMPROVE Geen MIDI-uitgangspoorten beschikbaar. De operatie wordt afgebroken Error. Aborting IMPROVE Fout. De operatie wordt afgebroken Chan: Channel: Kanaal: Oct: Base Octave: Grondoctaaf: Trans: Transpose: Transponeer: Vel: Velocity: Aanslagsnelheid: Control: Value: Waarde: Bender: Bank: Bank: Program: Programma: No help file found Geen helpbestand gevonden Language Changed Taal gewijzigd The language for this application is going to change to %1. Do you want to continue? De taal voor deze applicatie wordt veranderd naar %1. Wilt u verder gaan? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK is ontwikkeld en vertaald dankzij het vrijwilligerswerk door vele mensen over de hele wereld. Wilt u meehelpen of hebt u vragen, bezoek dan de forums op <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a>. Translation Vertaling <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Vertaling door Wouter Reckman (gennerate@zonnet.nl)</p>%1 Translation Information Vertalingsinformatie Czech Tsjechisch German Duits English Engels Spanish Spaans French Frans Dutch Nederlands Russian Russisch Swedish Chinese Chinees vmpk-0.4.0/translations/vmpk_sv.ts0000644000175000001440000031270611572642326016317 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Kompileringsdatum: %2<br/>Kompileringstid: %3<br/>Kompilator: %4</p></body></html> AboutClass About Om <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Kopieringsrätt © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program har öppen och fri källkod. Det kan återutges eller ändras i enlighet med GNU GPL (GNU:s General Public License), publicerad av Free Software Foundation, antingen enligt version 3 eller senare version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program ges ut med förhoppningen att det ska vara användbart, dock UTAN GARANTIER, såsom FÖRSÄLJNINGSGARANTIER eller GARANTIER FÖR ÄNDAMÅLSENLIGHET. Ytterligare detaljer finns i GNU GPL som levereras med detta program. Om inte licensen finns medskickad, se </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Följande kopieringsrättsnotis är under alla omständigheter gällande:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program innehåller </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: in- och utmatningsklasser i C++ för realtids-MIDI<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> {3C?} {4.0/?} {3.?} {40/?} {1"?} {10p?} {400;?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {2008-2011,?} {9p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {3 ?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {2003-2010 ?} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Kopieringsrätt © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program har öppen och fri källkod. Det kan återutges eller ändras i enlighet med GNU GPL (GNU:s General Public License), publicerad av Free Software Foundation, antingen enligt version 3 eller senare version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program ges ut med förhoppningen att det ska vara användbart, dock UTAN GARANTIER, såsom FÖRSÄLJNINGSGARANTIER eller GARANTIER FÖR ÄNDAMÅLSENLIGHET. Ytterligare detaljer finns i GNU GPL som levereras med detta program. Om inte licensen finns medskickad, se </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Följande kopieringsrättsnotis är under alla omständigheter gällande:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Detta program innehåller </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: in- och utmatningsklasser i C++ för realtids-MIDI<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> DialogExtraControls New Control Ny kontroll System Exclusive File Systemexklusiv fil System Exclusive (*.syx) Systemexklusiv (*.syx) Extra Controls Editor Extra kontrolleditor Label: Etikett: MIDI Controller: MIDI-kontroll: Add Lägg till Remove Ta bort Up Upp Down Ned Switch Växel Knob Ratt Spin box Bläddringsruta Slider Skjutreglage Button Ctl Ctl-knapp Button SysEx SysEx-knapp Default ON Standard: PÅ value ON: Värde PÅ: value OFF: Värde: AV: Min. value: Minstavärde: Max. value: Störstavärde: Default value: Ursprungsvärde: Display size: Visningsstorlek: value: Värde: File name: Filnamn: ... ... KMapDialog Open... Öppna ... Save As... Spara som ... Raw Key Map Editor Tangentbordseditor - rådata Key Map Editor TangentbordseditorTastaturbelegungseditor Key Code Tangentkod Key Tangent Open keyboard map definition Öppna teckenutläggning Keyboard map (*.xml) Tangentbindningar (*.xml) Save keyboard map definition Spara tangentbindningar KMapDialogClass Key Map Editor Tangentbindningseditor This box displays the name of the current mapping file Denna ruta visar namnet på det aktuella tangentbindningsschemat This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Detta är listan över tangentbindningar. Varje rad har ett nummer motsvarande MIDI-tonnumret, och du kan ange en alfanumerisk tangent som kommer att översättas till den aktuella tonen. 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 Key Tangent KeyboardMap Error loading a file Filladdningsfel Error saving a file Filsparandefel Error reading XML XML-läsningsfel File: %1 %2 Fil: %1 %2 MidiSetupClass MIDI Setup MIDI-inställningar Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Sätt en bock i denna ruta för att aktivera MIDI-inmatning i programmet. I Linux och Mac OSX är inmatningsporten alltid aktiverad och kan ej avaktiveras. Enable MIDI input Aktivera MIDI-inmatning Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Sätt en bock i denna ruta för att aktivera MIDI-genommatning: alla MIDI-händelser som tas emot kommer att kopieras till utmatningsporten. Enable MIDI Thru on MIDI Output Aktivera MIDI-genommatning för MIDI-utmatningen. Input MIDI Connection MIDI-inmatningsanslutning Use this control to change the connection for the MIDI input port, if it is enabled Använd denna kontroll för att ändra anslutning till MIDI-inmatningsporten, om den är aktiverad. Output MIDI Connection MIDI-utmatningsanslutning Use this control to change the connection for the MIDI output port Använd denna kontroll för att ändra anslutningen till MIDI-utmatningsporten. PianoScene C C C♯ Ciss D D D♯ Diss C# Ciss D# Diss E E F F F# Fiss G# Giss A# Aiss Db Dess Eb Ess Gb Gess Ab Ass Bb B F♯ Fiss G G G♯ Giss A A A♯ Aiss B H D♭ Dess E♭ Ess G♭ Gess A♭ Ass B♭ B Preferences Open instruments definition Öppna instrumentdefinitionerna Instrument definitions (*.ins) Instrumentdefinitioner (*.ins) Open keyboard map definition Öppna teckenbindningsschema Keyboard map (*.xml) Teckenbindningsschema (*.xml) PreferencesClass Preferences Inställningar Number of octaves Antal oktaver The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Antalet oktaver, från 1 till 10. Varje oktav har tolv tangenter: 7 vita och 5 svarta. MIDI-stadarden har 128 toner, men inte alla instrument kan spela allihop. Key pressed color Färg på nedtryckt tangent This box displays the highligh color and code used to paint the keys that are being activated. Denna ruta visar markeringsfärgen och koden som används när en tangent trycks ned. Press this button to change the highligh color used to paint the keys that are being activated. Klicka på denna knapp för att ändra markeringsfärg på nedtryckta tangenter. color... Färg ... Instruments file Instrumentfil The instruments definition file currently loaded Nuvarande instrumentdefinitionsfil default standard Press this button to load an instruments definition file from disk. Klicka på denna knapp för att ladda en instrumentdefinitionsfil. load... Öppna ... Instrument Instrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Ändrar nuvarande instrumentdefinitionsfil. Varje sådan fil kan innehålla flera instrument. Keyboard Map Tangentbindningar Load... Öffnen... Raw Keyboard Map There is no good/short way to translate this to german :-/ Tastenbelegung - Rohdaten Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Den Stil der Drehregler und Schalter ändern, entweder den eigenen oder den in qtconfig bestimmten Stil verwenden. Styled Widgets Eigener Bedienelemente-Stil <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dies ankreuzen, um die Rohdaten der Tastatur zu verwenden. Dieses System hat mehrere Vorteile:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es ist möglich, auch Steuertasten zu verwenden, z.B Akzent- und Sondertasten)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Zuweisungsdefinitionen sind unabhängig von der Sprache, aber nicht von Hardware und Betriebssystem)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Schnellere Bearbeitung</li></ul></body></html> Drums Channel Drumkit Kanal None Kein Kanal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Translate MIDI velocity to key pressed color tint MIDI Anschlagsdynamik bestimmt die Tastenfarbe Network Port Nätverksport Change the knob buttons style, either using the custom look or revert to the style selected in qtconfig. Mit dieser Option kann man das Aussehen der Knöpfe verändern; entweder der eigene Stil oder das Standardaussehen. Styled Knobs Stylische Knöpfe Check this box to keep the keyboard window always visible, on top of other windows. Diese Option hebt das Tastaturfenster in den Vordergrund und behält es immer über allen anderen Fenstern. Always On Top Im Vordergrund bleiben <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> Diese Option fängt die Tastatur ein, sodaß jeder Tastendruck unmittelbar an die Anwendung gesendet wird. (Unter Linux funktioniert dies nur unter KDE) Grab Computer Keyboard Computertastatur behalten Raw Computer Keyboard Computertastatur-Rohdaten verwenden Grab keyboard Tastatur einfangen Check this box to display the note names over the piano keys. Diese Option stellt die Notennamen auf den Tasten dar. Show Note Names Notennamen anzeigen QObject Cakewalk Instrument Definition File Instrumentdefinitionsfil för Cakewalk File Fil Date Datum RiffImportDlg Input SoundFont Inmatningsfil (SoundFont) SoundFonts (*.sf2 *.sbk *.dls) SoundFont-filer (*.sf2 *.sbk *.dls) Output Ausgabedatei Instrument definitions (*.ins) Instrumentdefinitionen (*.ins) Import SoundFont instruments SoundFont importieren Input File Eingabedatei This text box displays the path and name of the selected SoundFont to be imported Dieses Eingabefeld gibt den Pfad und den Namen der ausgewählten Musikschriftart an, die importiert werden soll Press this button to select a SoundFont file to be imported Hier klicken, um eine SoundFont-Datei zu importieren ... Name Version Copyright Output File Ausgabedatei This text box displays the name of the output file in .INS format that will be created Dieses Eingabefeld zeigt den Namen der zu erstellenden Ausgabedatei im .INS Format an Press this button to select a path and file name for the output file Hier kann man den Pfad und die Datei für die Ausgabedatei auswählen ShortcutDialog Keyboard Shortcuts Kortkommandon Action Aktion Description Beschreibung Shortcut Kürzel Warning Warnung Keyboard shortcuts have been changed. Do you want to apply the changes? Die Tastenkürzel wurden geändert. Wollen Sie die Änderungen anwenden? VPiano Error Fel No MIDI output ports available. Aborting Inga MIDI-utmatningsportar tillgängliga. Avbryter. Error. Aborting Fel: Avbryter. Chan: Kanal: Channel: Kanal: Oct: Oktav: Base Octave: Oktav för Z-M: Trans: Transposition: Transpose: Transponera: Vel: Hastighet: Velocity: Anslag: Control: Kontroll: Value: Värde: Bender: Tonbändning: Bank: Bank: Program: Program: The language for this application is going to change to %1. Do you want to continue? Användargränssnittets språk kommer att ändras till %1. Vill du fortsätta? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> VMPK utvecklas och översätts tack vare frivilliginsatser av många människor över hela världen. Om du vill ansluta till denna grupp eller har några frågor, var vänlig besök <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Om översättningarna Swedish Svenska Translation Översättning <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Översatt av Erik Magnus Johansson (e.m.johansson@spray.se) </p>%1 Czech Tjeckiska German Tyska English Engelska Spanish Spanska French Franska Dutch Holländska Russian Ryska Turkish Turkiska Chinese Kinesiska Language Changed Språket är ändrat Channel: Kanal: Base Octave: Basisoktave: Transpose: Transponieren: Velocity: Geschwindigkeit: Control: Kontrolle: Value: Wert: Program: Programm: Open keyboard map definition Öffne Tastaturbelegungsdatei Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Save keyboard map definition Speichere Tastaturbelegung No help file found Ingen hjälpfil funnen Virtual Piano Keyboard Virtuelle Piano-Tastatur &File &Fil &Edit &Bearbeta Keyboard map Tastaturbelegung &Help &Hjälp &Language &Språk &View &Visa &Tools &Verktyg Notes Noter Controllers Kontroller Programs Program &Notes &Noter &Controllers &Kontroller Pitch &Bender Ton&bändare &Programs &Program &Extra Controls &Extrakontroller &Quit &Avsluta Exit the program Programmet avslutas &Preferences &Inställningar Edit the program settings Ändra programinställningar &Connections MIDI-&anslutningar Edit the MIDI connections Ändra MIDI-anslutningar &About &Om Show the About box Visa Om-fönstret About Q&t Über Q&t About &Qt Om &Qt Show the Qt about box Visar information om QT Show or hide the Notes toolbar Visa eller göm verktygslisten Noter Show or hide the Controller toolbar Visa eller göm verktygslisten Kontroll Show or hide the Pitch Bender toolbar Visa eller göm verktygslisten Tonbändning Show or hide the Programs toolbar Visa eller göm verktygslisten Program &Status Bar &Statuslist Show or hide the Status Bar Visa eller göm statuslisten Panic Panik Stops all active notes Stoppa alla aktiva toner Esc Esc Reset All Återställ alla Resets all the controllers Återställ alla kontroller Reset Återställ Resets the Bender value Återställ tonbändvärdet F1 F1 Import SoundFont Importera ljudbank Show or hide the Extra Controls toolbar Visa eller göm verktygslisten Extrakontroller Edit Bearbeta Open the Extra Controls editor Öppna editorn Extrakontroller Open the Banks/Programs editor Öppna editorn för bank och program &Extra Controllers &Extrakontroller N&ote Names T&onnamn Show or hide the note names Visa eller göm tonnamn &Shortcuts &Kortkommandon Open the Shortcuts editor Öppna editorn för kortkommandon Octave Up En oktav upp Play one octave higher Spela en oktav högre Right Höger Octave Down En oktav ned Play one octave lower Spela en oktav lägre Left Vänster Transpose Up Transponera uppåt Transpose one semitone higher Transponera ett halvtonsteg uppåt Ctrl+Right Ctrl+Höger Transpose Down Transponera nedåt Transpose one semitone lower Transponera ett halvtonsteg nedåt Ctrl+Left Ctrl+Vänster Next Channel Nästa kanal Play and listen next channel Spela och lyssna på nästa kanal Previous Channel Föregående kanal Play and listen previous channel Spela och lyssna på föregående kanal Home Hem About &Translation Om &översättningen Show information about the program language translation Visar information om översättningen av användargränssnittet Up Upp Down Ned Next Controller Nästa kontroll Select the next controller Välj nästa kontroll Ctrl++ Ctrl++ Previous Controller Föregående kontroll Select the previous controller Välj föregående kontroll Ctrl+- Ctrl+- Controller Up Kontroll upp Increment the controller value Öka kontrollvärdet + + Controller Down Kontroll ned Decrement the controller value Minska kontrollvärdet - - Next Bank Nästa bank Select the next instrument bank Välj nästa instrumentbank Ctrl+PgUp Ctrl+PgUp Previous Bank Föregående bank Select the previous instrument bank Välj föregående instrumentbank Ctrl+PgDown Ctrl+PgDn Next Program Nästa program Select the next instrument program Välj nästa instrumentprogram PgUp PgUp Previous Program Föregående program Select the previous instrument program Välj föregående instrumentprogram PgDown PgDn Velocity Up Anslag upp Increment note velocity Öka anslag End Slut Velocity Down Anslag ned Decrement note velocity Minska anslag Load... Laden... Load another keyboard layout Lade eine andere Tastaturbelegung Save... Speichern... Save the current keyboard layout Speichere die aktuelle Tastaturbelegung &Keyboard Map &Tangentbindningar Edit... Bearbeiten... Edit the current keyboard layout Ändra nuvarande tangentbindningar &Contents &Innehåll Open the index of the help document Öppna innehållsförteckningen i hjälpdokumentet VMPK &Web site VMPK:s &hemsida Open the VMPK web site address using a web browser Öppna VMPK:s hemsida med hjälp av en brusare &Import SoundFont... &Importera ljudbank ... vmpk-0.4.0/translations/vmpk_zh_CN.ts0000644000175000001440000035072111572642326016667 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">版本: %1<br/>创建日期: %2<br/>创建时间: %3<br/>编译器: %4</p></body></html> AboutClass About 关于 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">版权所有 © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> {3C?} {4.0/?} {3.?} {40/?} {1"?} {10p?} {400;?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {2008-2011,?} {9p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {3 ?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {2003-2010 ?} <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008, Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program contains RtMIDI: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2008, Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">This program contains RtMIDI: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">版权所有 © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Copyright © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program contains <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">版权所有 © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本软件是自由软件: 您可以自由的发布或依照自由软件基金会的GNU 通用公众许可协议(版本3或之后的版本)修改它。</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">希望本程序的发布对您有用,但作者对软件的使用不作任何保证, 也没有鉴于一个特殊的目的的可买卖性或适应性. 详见 GNU 通用软件许可 .您应该随本软件收到一份 GNU 通用软件许可, 如果没有, 见 <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">下列的版权信息同样适用:</p><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">本程序包含 <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: 实时 MIDI 输入/输出 C++ 类库<br />版权所有 © 2003-2007 Gary P. Scavone</p></body></html> DialogExtraControls New Control 新控件 System Exclusive File 系统独有信息 文件 System Exclusive (*.syx) 系统独有信息 文件 (*.syx) Extra Controls Editor 附加控制器 Label: 名称: MIDI Controller: MIDI 控制器: Add 添加 Remove 移除 Up 向上 Down 向下 Switch 开关 Knob 旋钮 Spin box 数字显示框 Slider 滑动条 Button Ctl 按钮 控制器 Button SysEx 按钮 SysEx(系统独占消息) Default ON 默认 打开 value ON: 打开对应值: value OFF: 关闭对应值: Min. value: 最小值: Max. value: 最大值: Default value: 默认值: Display size: 控件长度: value: 值: File name: 文件名: ... ... KMapDialog Open... 打开... Save As... 另存为... Raw Key Map Editor 原始键盘映射编辑器 Key Map Editor 键盘映射编辑器 Key Code 键码 Key Open keyboard map definition 打开键盘映射文件 Keyboard map (*.xml) 键盘映射文件 (*.xml) Save keyboard map definition 保存键盘映射文件 KMapDialogClass Key Map Editor 键盘映射编辑器 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key This box displays the name of the current mapping file 此方框显示当前映射文件的文件名 This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note 这是 PC 键盘的键值映射列表. 每一行包含一个对应 MIDI 音符的数字, 您可以输入键的文字名称, 程序将把它转换为对应的 MIDI 音符 KeyboardMap File: %1 %2 文件: %1\n%2 Error loading a file 加载文件出错 Error saving a file 保存文件出错 Error reading XML 读取XML文本出错 MidiSetupClass MIDI Setup MIDI 设置 Enable MIDI input 允许 MIDI 输入 Input MIDI Connection MIDI 输入 Output MIDI Connection MIDI 输出 Enable MIDI Thru on MIDI Output 允许 MIDI Thru 转发到 MIDI 输出 Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked 选中此复选框以允许程序接收 MIDI 输入.在 Linux 和 Mac OSX 系统下输入端口总是允许状态,不能被禁用 Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port 选中此复选框以激活 MIDI Thru 功能: 从 MIDI 输入接收到的所有数据都会被转发到 MIDI 输出端口 Use this control to change the connection for the MIDI input port, if it is enabled 使用此控件切换 MIDI 输入端口 Use this control to change the connection for the MIDI output port 使用此控件切换 MIDI 输出端口 PianoScene C C C♯ C♯ D D D♯ D♯ C# D# E E F F F# G# A# Db Eb Gb Ab Bb F♯ F♯ G G G♯ G♯ A A A♯ A♯ B B D♭ D♭ E♭ E♭ G♭ G♭ A♭ A♭ B♭ B♭ Preferences Open instruments definition 打开乐器定义文件 Instrument definitions (*.ins) 乐器定义文件 (*.ins) Open keyboard map definition 打开键盘映射文件 Keyboard map (*.xml) 键盘映射文件 (*.xml) PreferencesClass Preferences 首选项 Input Channel Canal de Entrada Output Channel Canal de Salida Velocity Velocidad Base octave Octava base Number of octaves 八度个数 Key pressed color 键按下时的颜色 color... 颜色... Instruments file 乐器定义文件 default 默认 load... 加载... Instrument 乐器 Grab keyboard Capturar teclado Styled Knobs Aplicar estilos The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. 八度个数取值范围从 1 到 10. 每个八度包含 12 个键: 7 个白键和 5 个黑键. MIDI 标准包含 128 个音符, 但不是所有乐器都有128 个音. This box displays the highligh color and code used to paint the keys that are being activated. 此方框显示用于绘制激活状态琴键的颜色和颜色代码. Press this button to change the highligh color used to paint the keys that are being activated. 按此按钮以改变用于绘制激活状态琴键的颜色. The instruments definition file currently loaded 当前加载的乐器定义文件 Press this button to load an instruments definition file from disk. 按此按钮从磁盘中加载一个乐器定义文件. Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. 改变当前使用的乐器定义文件, 每个乐器定义文件内保存了一些乐器信息。 Keyboard Map 键盘映射 Load... 加载... Raw Keyboard Map 原始键盘映射 Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. 改变小控件 (旋钮, 开关) 样式, 使用自定义的外观, 或恢复 Qt 库中设置的样式. Styled Widgets 样式化界面控件 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">选中此项以使用底层 PC 键盘事件. 此功能如下优势:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">可以使用"无效键"(dead keys), 如重音符号, 读音符号等.</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">映射定义独立于语言,但和硬件以及操作系统相关.</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">更快速的处理</li></ul></body></html> Drums Channel 鼓通道 None 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Translate MIDI velocity to key pressed color tint 用颜色深浅表示Midi音符力度 Network Port Change the knob buttons style, either using the custom look or revert to the style selected in qtconfig. Cambie el estilo de los controles, o bién usando el aspecto personalizado o volviendo al estilo seleccionado en qtconfig Check this box to keep the keyboard window always visible, on top of other windows. 选中此框让键盘窗口总是可见, 并出现在其它窗口之上. Always On Top 总在最前面 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">选中此框以抓取 PC 键盘消息, 即使键盘控件失去焦点.<span style=" font-weight:600;">Linux 用户注意:</span> 此选项在标准 KDE 桌面环境下工作正常, 但在窗口管理器 metacity 和 compiz 不能工作. 使用此选项也会切断 GTK 程序的下拉菜单.</p></body></html> Grab Computer Keyboard 抓取计算机键盘 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster process</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Marque esta casilla para selección el teclado de bajo nivel. Esto tiene varias ventajas:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es posible usar "teclas muertas" (acentos, diacríticos)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Las definiciones de mapas son independientes del lenguage (pero dependientes del hardware/sistema operativo)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceso más rápido</li></ul></body></html> Raw Computer Keyboard 原始计算机键盘 Check this box to display the note names over the piano keys. Marque esta casilla para mostrar los nombres de las notas sobre las teclas del piano Show Note Names Mostrar nombres de notas QObject Cakewalk Instrument Definition File Cakewalk 乐器定义文件 File 文件 Date 日期 RiffImportDlg Input SoundFont 输入音色库 SoundFont SoundFonts (*.sf2 *.sbk *.dls) 音色库文件 SoundFonts (*.sf2 *.sbk *.dls) Output 输出 Instrument File (*.ins) Definición de instrumentos (*.ins) Import Sound Font instruments Importar instrumentos de SoundFonts Input File 输入文件 This text box displays the path and name of the selected Sound Font to be imported Esta cada muestra la ruta y el nombre del archivo SoundFont seleccionado que va a ser importado Press this button to select a Sound Font file to be imported Pulse este botón para seleccionar un archivo SoundFont para ser importado ... ... Name 名称 Version 版本 Copyright 版权 Output File 输出文件 This text box displays the name of the output file in .INS format that will be created 此文本框显示将要创建的扩展名为 .INS 的输入文件名 Press this button to select a path and file name for the output file 按此按钮为输出文件选择路径和文件名 Instrument definitions (*.ins) 乐器定义文件 (*.ins) Import SoundFont instruments 导入音色库 SoundFont 中的乐器 This text box displays the path and name of the selected SoundFont to be imported 此文本框显示要导入的音色库 SoundFont 文件的路径和文件名 Press this button to select a SoundFont file to be imported 按此按钮选择要导入的音色库 SoundFont 文件 ShortcutDialog Keyboard Shortcuts 键盘快捷键 Action 命令 Description 描述 Shortcut 快捷键 Warning 警告 Keyboard shortcuts have been changed. Do you want to apply the changes? 键盘快捷键已经更改. 希望应用这些改变吗? VPiano Error 错误 No MIDI output ports available. Aborting 没有可用的 MIDI 输出端口. 终止 Error. Aborting 错误. 终止 Chan: Channel: 通道: Oct: Base Octave: 基准八度: Trans: Transpose: 移调: Vel: Velocity: 力度: Control: 控制器: Value: 值: Bender: 弯音控制器: Bank: 音色库号: Program: 音色: The language for this application is going to change to %1. Do you want to continue? 应用程序的界面语言将要改变为 %1. 继续吗? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK 由来自全球的志愿者开发并翻译. 如果您想加入我们或有任何疑问, 请访问 <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a>的论坛</p> Translation Information 翻译信息 Swedish Translation 翻译 <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>译者 Rui Fan (<a href='mailto:vanferry@gmail.com'>vanferry@gmail.com</a>)</p>%1 Czech Czech German German English English Spanish Spanish French French Dutch Russian Russian Turkish Turkish Chinese 简体中文 Language Changed 语言已变更 Channel: Canal: Base Octave: Octava base: Transpose: Transposición: Velocity: Velocidad: Control: Control: Value: Valor: Bender: Inflexión: Bank: Banco: Program: Programa: Open keyboard map definition Abrir definición de mapa de teclado Keyboard map (*.xml) Mapa de teclado (*.xml) Save keyboard map definition Guardar definición de mapa de teclado Virtual Piano Keyboard Teclado de Piano Virtual &File (&F)文件 &Edit (&E)编辑 Keyboard map Mapa de teclado &Help (&H)帮助 &Language (&L)语言 &View (&V)查看 &Tools (&T)工具 Notes 音符 Controllers 控制器 Programs 音色 &Notes (&N)音符 &Controllers (&C)控制器 Pitch &Bender 弯音控制器 &Programs (&P)音色 &Extra Controls (&E)附加控制器 &Quit (&Q)退出 Exit the program 退出程序 &Preferences (&P)首选项 Edit the program settings 编辑程序选项 &Connections (&C)连接 Edit the MIDI connections 编辑 MIDI 连接 &About (&A)关于 Show the About box 显示关于对话框 About Q&t 关于 Q&t About &Qt 关于 Q&t Show the Qt about box 显示关于 Qt 对话框 Show or hide the Notes toolbar 显示或隐藏音符工具栏 Show or hide the Controller toolbar 显示或隐藏控制器工具栏 Show or hide the Pitch Bender toolbar 显示或隐藏弯音工具栏 Show or hide the Programs toolbar 显示或隐藏音符工具栏 &Status Bar (&S)状态栏 Show or hide the Status Bar 显示或隐藏状态栏 Panic Panic Stops all active notes 停止所有发声音符 Esc Esc Reset All 重置所有 Resets all the controllers 重置所有控制器 Reset 重置 Resets the Bender value 重置弯音控制器 F1 F1 Import SoundFont 导入 SoundFont Show or hide the Extra Controls toolbar 显示或隐藏特别控制器工具条 Edit 编辑 Open the Extra Controls editor 打开附加控制器编辑器 Open the Banks/Programs editor 打开 音色库(Bank)/音色 编辑器 &Extra Controllers (&E)附加控制器 N&ote Names (&o)音符名称 Show or hide the note names 显示或隐藏音符名称 &Shortcuts (&S)快捷键 Open the Shortcuts editor 打开快捷键编辑器 Octave Up 八度 向上 Play one octave higher 高一个八度弹奏 Right Right Octave Down 八度 向下 Play one octave lower 低一个八度弹奏 Left Left Transpose Up 移调 向上 Transpose one semitone higher 向上移调一个半音 Ctrl+Right Ctrl+Right Transpose Down 移调 向下 Transpose one semitone lower 向下移调一个半音 Ctrl+Left Ctrl+Left Next Channel 下一个通道 Play and listen next channel 播放并监听下一个通道 Previous Channel 前一个通道 Play and listen previous channel 播放并监听前一个通道 Home Home About &Translation 关于翻译 Show information about the program language translation 显示软件的翻译信息 Up 向上 Down 向下 Next Controller 下一个控制器 Select the next controller 选中下一个控制器 Ctrl++ Ctrl++ Previous Controller 前一个控制器 Select the previous controller 选中前一个控制器 Ctrl+- Ctrl+- Controller Up 控制器向上 Increment the controller value 增加控制器的值 + + Controller Down 控制器向下 Decrement the controller value 减少控制器的值 - - Next Bank 下一个库号 Select the next instrument bank 选中下一个乐器库号(Bank) Ctrl+PgUp Ctrl+PgUp Previous Bank 前一个库号 Select the previous instrument bank 选中前一个乐器库号 Ctrl+PgDown Ctrl+PgDown Next Program 下一个音色 Select the next instrument program 选中下一个乐器音色 PgUp PgUp Previous Program 前一个音色 Select the previous instrument program 选中前一个乐器音色 PgDown PgDown Velocity Up 力度向上 Increment note velocity 增加音符力度 End End Velocity Down 力度向下 Decrement note velocity 减少音符力度 Load... Abrir... Load another keyboard layout Abrir otra disposición de teclado Save... Guardar... Save the current keyboard layout Guardar la disposición de teclado actual &Keyboard Map (&K)键盘映射 Edit... Editar... Edit the current keyboard layout 编辑当前键盘布局 &Contents (&C)内容 Open the index of the help document 打开帮助文档的索引 VMPK &Web site (&W)VMPK 网站 Open the VMPK web site address using a web browser 使用网络浏览器打开 VMPK 网站 &Import SoundFont... (&I)导入音色库(SoundFont)... No help file found 未找到帮助文档 vmpk-0.4.0/translations/vmpk_cs.ts0000644000175000001440000033100611572642326016266 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Datum sestavení: %2<br/>Čas sestavení: %3<br/>Překladač: %4</p></body></html> AboutClass About O programu <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Zdánlivá klaviatura klavíru MIDI</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Autorské právo © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je svobodným programem: můžete jej šířit a/nebo upravovat za podmínek GNU General Public License, jak jsou zveřejněny Free Software Foundation, buď ve verzi 3 povolení, nebo (podle své volby) v jakékoli pozdější verzi.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je šířen s nadějí, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; dokonce bez předpokládané záruky PRODEJNOSI nebo VHODNOSTI PRO ZVLÁŠTNÍ ÚČEL. Kvůli podrobnostem se podívejte na GNU General Public License. Měl byste kopii GNU General Public License obdržet společně s tímto programem. A pokud ne, podívejte se na </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Následující poznámka k autorskému právu je rovněž platná:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program obsahuje </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ třídy<br />Autorské právo © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Autorské právo © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je svobodným programem: můžete jej šířit a/nebo upravovat za podmínek GNU General Public License, jak jsou zveřejněny Free Software Foundation, buď ve verzi 3 povolení, nebo (podle své volby) v jakékoli pozdější verzi.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program je šířen s nadějí, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; dokonce bez předpokládané záruky PRODEJNOSI nebo VHODNOSTI PRO ZVLÁŠTNÍ ÚČEL. Kvůli podrobnostem se podívejte na GNU General Public License. Měl byste kopii GNU General Public License obdržet společně s tímto programem. A pokud ne, podívejte se na </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Následující poznámka k autorskému právu je rovněž platná:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Tento program obsahuje </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ třídy<br />Autorské právo © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Copyright © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program contains <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Autorské právo © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tento program je svobodným software: můžete jej šířit a/nebo upravovat za podmínek uvedených v GNU General Public License, jak byly zveřejněny Free Software Foundation, buď ve verzi 3 licence, nebo (volitelně) v jakékoli pozdější verzi.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tento program je šířen v naději, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; také bez předpokládané záruky PRODEJNOSTI nebo POUŽITELNOSTI PRO NĚJAKÝ URČITÝ ÚČEL: Více podrobností naleznete v GNU Library General Public License. Kopii GNU Library General Public License byste měl obdržet společně s tímto programem; a pokud ne, podívejte se na<a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Následující poznámka k autorskému právu je také platná:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tento program obsahuje <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: MIDI ve skutečném čase i/o C++ třídy<br />Autorské právo © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> DialogExtraControls New Control Nový ovládací prvek System Exclusive File Výhradní systémový soubor System Exclusive (*.syx) Výhradní systémový (*.syx) Extra Controls Editor Editor ovládacích prvků navíc Label: Štítek: MIDI Controller: Ovládací prvek MIDI: Add Přidat Remove Odstranit Up Nahoru Down Dolů Switch Přepnout Knob Knoflík Spin box Otočný regulátor Slider Posuvník Button Ctl Tlačítko Ctl Button SysEx Tlačítko SysEx Default ON Výchozí ZAPNUTO value ON: Hodnota ZAPNUTO: value OFF: Hodnota VYPNUTO: Min. value: Nejmenší hodnota: Max. value: Největší hodnota: Default value: Výchozí hodnota: Display size: Velikost zobrazení: value: Hodnota: File name: Název souboru: ... ... KMapDialog Open... Otevřít... Save As... Uložit jako... Raw Key Map Editor Editor neupraveného přiřazení kláves Key Map Editor Editor přiřazení kláves Key Code Kód klávesy Key Klávesa Open keyboard map definition Otevřít soubor s přiřazením kláves na klávesnici Keyboard map (*.xml) Soubor s uspořádáním klávesnice (*.xml) Save keyboard map definition Uložit soubor s uspořádáním klávesnice KMapDialogClass Key Map Editor Editor přiřazení kláves This box displays the name of the current mapping file Toto políčko ukazuje název nyní používaného souboru s uspořádáním klávesnice This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Toto je seznam s uspořádáním klávesnice počítače. Každý řádek má své číslo, které odpovídá číslu noty MIDI, přičemž musíte zadat název alfanumerické klávesy, jenž bude přeložen do dané noty 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Klávesa KeyboardMap Error loading a file Chyba při nahrávání souboru Error saving a file Chyba při ukládání souboru Error reading XML Chyba při čtení souboru XML File: %1 %2 Soubor: %1 %2 MidiSetupClass MIDI Setup Nastavení MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Zaškrtněte toto políčko kvůli zapnutí vstupu MIDI pro program. V Linuxu a MacOS X je vstup vždy zapnut a nelze jej vypnout Enable MIDI input Povolit vstup MIDI Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Zaškrtněte toto políčko kvůli zapnutí funkce přepojení MIDI. Při zapnutí této volby bude kterákoli událost MIDI, příchozí signál přijatý ve vstupní přípojce, kopírována automaticky také do výstupní přípojky Enable MIDI Thru on MIDI Output Povolit přepojení MIDI na výstup MIDI Input MIDI Connection Spojení vstupu MIDI Use this control to change the connection for the MIDI input port, if it is enabled Použijte tento ovládací prvek pro změnu současného uspořádání spojení vstupu MIDI, pokud je povoleno Output MIDI Connection Spojení výstupu MIDI Use this control to change the connection for the MIDI output port Použijte tento ovládací prvek pro změnu současného uspořádání spojení vstupu MIDI PianoScene C C C♯ C♯ D D D♯ D♯ C# Cis D# Dis E E F F F# Fis G# Gis A# Ais Db Des Eb Es Gb Ges Ab As Bb Hes F♯ F♯ G G G♯ G♯ A A A♯ A♯ B H D♭ D♭ E♭ E♭ G♭ G♭ A♭ A♭ B♭ H♭ Preferences Open instruments definition Otevřít soubor s vymezením nástroje Instrument definitions (*.ins) Vymezení nástrojů (*.ins) Open keyboard map definition Otevřít soubor s přiřazením kláves na klávesnici Keyboard map (*.xml) Soubor s uspořádáním klávesnice (*.xml) PreferencesClass Preferences Nastavení Number of octaves Počet oktáv The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Počet oktáv, od 1 do 10. Každá oktáva má 12 kláves: 7 bílých a 5 černých. MIDI standard má 128 not, ale všechny nástroje je dokáží přehrát všechny. Key pressed color Barva stisknuté klávesy This box displays the highligh color and code used to paint the keys that are being activated. Toto políčko ukazuje zvýrazňovací barvu, která je použita pro nakreslení kláves, jež jsou uváděny v činnost, a její kód. Press this button to change the highligh color used to paint the keys that are being activated. Stiskněte toto tlačítko, abyste změnil zvýrazňovací barvu, která je použita pro nakreslení kláves, jež jsou uváděny v činnost. color... Barva... Instruments file Soubor s nástrojem The instruments definition file currently loaded Soubor s vymezením nástroje, který je v současnosti nahrán default Výchozí Press this button to load an instruments definition file from disk. Stiskněte toto tlačítko, abyste nahrál soubor s vymezením nástroje z pevného disku. load... Nahrát... Instrument Nástroj Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Změňte soubor s vymezením nástroje, který je v současnosti používán. Každý soubor s vymezením nástroje může více obsahovat nástrojů. Keyboard Map Uspořádání klávesnice Load... Nahrát... Raw Keyboard Map There is no good/short way to translate this to german :-/ Neupravené přiřazení kláves Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Změňte styl prvku (knoflíky, přepínače), buď pomocí uživatelsky stanoveného vzhledu, nebo vrácením se k stylu vybranému v qtconfig. Styled Widgets Stylizované prvky <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zaškrtněte toto políčko kvůli použití nízkoúrovňových událostí klávesnice počítače. Tento systém má několik výhod:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je možné použít "mrtvých kláves" (značky akcentů, diakritika)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vymezení přiřazení jsou nezávislá na jazyku (ale přesně stanovená u každého technického vybavení a operačního systému)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rychlejší zpracování</li></ul></body></html> Drums Channel Kanál bicích None Žádný 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Translate MIDI velocity to key pressed color tint Přeložit rychlost MIDI na barevný odstín stisknuté klávesy Network Port Síťová přípojka Change the knob buttons style, either using the custom look or revert to the style selected in qtconfig. Mit dieser Option kann man das Aussehen der Knöpfe verändern; entweder der eigene Stil oder das Standardaussehen. Styled Knobs Stylische Knöpfe Check this box to keep the keyboard window always visible, on top of other windows. Zaškrtnutí tohoto políčka zajistí to, že okno s klávesnicí bude vždy viditelné a zůstane zobrazeno v popředí nad všemi ostatními okny. Always On Top Vždy nahoře <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Zaškrtněte toto políčko kvůli popadnutí klávesnice počítače, i když nemá ovládání klávesnice ohnisko. <span style=" font-weight:600;">Poznámka pro linuxové uživatele:</span> tato volba pracuje dobře s běžnými plochami KDE, ale selhává v okenních správcích, jakými jsou metacity a compiz. Je také dobře známou skutečností, že použití této volby porušuje rozbalovací nabídky GTK aplikací.</p></body></html>Tato volba popadne klávesnici, takže každý stisk klávesy je bezprostředně poslán aplikaci. (V Linuxu pracuje pouze pod KDE) Grab Computer Keyboard Popadnout klávesnici počítače Raw Computer Keyboard Popadnout neupravenou klávesnici počítače Grab keyboard Tastatur einfangen Check this box to display the note names over the piano keys. Zaškrtněte toto políčko kvůli zobrazení názvů not nad klávesami klavíru. Show Note Names Ukázat názvy not QObject Cakewalk Instrument Definition File Soubor s vymezením nástroje Cakewalk File Soubor Date Datum RiffImportDlg Input SoundFont Zvukové písmo pro vstup SoundFonts (*.sf2 *.sbk *.dls) Zvuková písma (*.sf2 *.sbk *.dls) Output Výstup Instrument definitions (*.ins) Vymezení nástrojů (*.ins) Import SoundFont instruments Zavést nástroje se zvukovým písmem Input File Vstupní soubor This text box displays the path and name of the selected SoundFont to be imported Toto zadávací textové pole zobrazuje cestu a název vybraného zvukového písma, které se má zavést Press this button to select a SoundFont file to be imported Stiskněte toto tlačítko, abyste vybral soubor se zvukovým písmem, které se má zavést ... ... Name Název Version Verze Copyright Autorské právo Output File Výstupní soubor This text box displays the name of the output file in .INS format that will be created Toto zadávací textové pole zobrazuje název výstupního souboru ve formátu .INS, který bude vytvořen Press this button to select a path and file name for the output file Stiskněte toto tlačítko, abyste vybral cestu a souborový název pro výstupní soubor ShortcutDialog Keyboard Shortcuts Klávesové zkratky Action Činnost Description Popis Shortcut Zkratka Warning Varování Keyboard shortcuts have been changed. Do you want to apply the changes? Klávesové zkratky byly změněny. Chcete použít tyto změny? VPiano Error Chyba No MIDI output ports available. Aborting Nejsou dostupné žádné výstupní přípojky MIDI. Ruší se Error. Aborting Chyba. Ruší se Chan: Kan: Channel: Kanál: Oct: Okt: Base Octave: Základní oktáva: Trans: Přev: Transpose: Převést: Vel: Rych: Velocity: Rychlost: Control: Ovládací prvek: Value: Hodnota: Bender: Měnič: Bank: Banka: Program: Program: The language for this application is going to change to %1. Do you want to continue? Jazyk pro tento program bude změněn na %1. Chcete pokračovat? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK je vyvíjen a překládán díky dobrovolnické práci mnoha lidí z celého světa. Pokud se chcete připojit k družstvu, nebo máte nějaké otázky, navštivte, prosím, fórum na <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Informace o překladech Swedish Švédština Translation Překlad <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Překlad: Pavel Fric, fripohled.blogspot.com</p>%1 Czech Čeština German Němčina English Angličtina Spanish Španělština French Francouzština Dutch Nizozemština Russian Ruština Turkish Turečtina Chinese Čínština Language Changed Jazyk byl změněn Channel: Kanal: Base Octave: Basisoktave: Transpose: Transponieren: Velocity: Geschwindigkeit: Control: Kontrolle: Value: Wert: Program: Programm: Open keyboard map definition Öffne Tastaturbelegungsdatei Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Save keyboard map definition Speichere Tastaturbelegung No help file found Nepodařilo se najít žádný soubor s nápovědou Virtual Piano Keyboard Hrací deska klaviatury zdánlivého klavíru &File &Soubor &Edit &Úpravy Keyboard map Tastaturbelegung &Help &Nápověda &Language &Jazyk &View &Pohled &Tools &Nástroje Notes Noty Controllers Ovladače Programs Programy &Notes &Noty &Controllers &Ovládací prvky Pitch &Bender &Měnič výšky tónu &Programs &Programy &Extra Controls Další &nastavení &Quit &Ukončit Exit the program Ukončit program &Preferences &Nastavení Edit the program settings Upravit nastavení programu &Connections &Spojení Edit the MIDI connections Upravit spojení MIDI &About &O Show the About box Ukázat informace o programu About Q&t O Q&t About &Qt O &Qt Show the Qt about box Ukázat informace o Qt Show or hide the Notes toolbar Ukázat nebo skrýt nástrojový pruh s notami Show or hide the Controller toolbar Ukázat nebo skrýt nástrojový pruh s ovládacími prvky Show or hide the Pitch Bender toolbar Ukázat nebo skrýt nástrojový pruh s měničem výšky tónu Show or hide the Programs toolbar Ukázat nebo skrýt nástrojový pruh programu &Status Bar &Stavový řádek Show or hide the Status Bar Ukázat nebo skrýt stavový pruh Panic Nouzové zastavení Stops all active notes Zastaví všechny noty, které jsou v činnosti Esc Esc Reset All Nastavit znovu vše Resets all the controllers Nastaví znovu všechny ovládací prvky Reset Nastavit znovu Resets the Bender value Nastaví znovu hodnotu měniče F1 F1 Import SoundFont Zavést zvukové písmo Show or hide the Extra Controls toolbar Ukázat nebo skrýt nástrojový pruh s ovládacími prvky navíc Edit Upravit Open the Extra Controls editor Ukázat editor dalších ovládacích prvků Open the Banks/Programs editor Ukázat editor bank/programů &Extra Controllers &Další ovládací prvky N&ote Names Názvy n&ot Show or hide the note names Ukázat nebo skrýt názvy not &Shortcuts &Zkratky Open the Shortcuts editor Otevřít editor zkratek Octave Up O oktávu nahoru Play one octave higher Přehrát o jednu oktávu výše Right Vpravo Octave Down O oktávu dolů Play one octave lower Přehrát o jednu oktávu níže Left Vlevo Transpose Up Převést nahoru Transpose one semitone higher Převést o jeden půltón výše Transpose Down Převést dolů Transpose one semitone lower Převést o jeden půltón níže Next Channel Další kanál Play and listen next channel Přehrát a poslouchat další kanál Previous Channel Předchozí kanál Play and listen previous channel Přehrát a poslouchat předchozí kanál Home Home About &Translation O &překladu Show information about the program language translation Ukázat informace o překladu jazyka programu Up Nahoru Down Dolů Next Controller Další ovládací prvek Select the next controller Vybrat další ovládací prvek Ctrl++ Ctrl++ Previous Controller Předchozí ovládací prvek Select the previous controller Vybrat předchozí ovládací prvek Ctrl+- Ctrl+- Controller Up Ovládací prvek nahoru Increment the controller value Zvýšit hodnotu ovladače + + Controller Down Ovládací prvek dolů Decrement the controller value Snížit hodnotu ovladače - - Next Bank Další banka Select the next instrument bank Vybrat další nástrojovou banku Ctrl+PgUp Ctrl+PgUp Previous Bank Předchozí banka Select the previous instrument bank Vybrat předchozí nástrojovou banku Ctrl+PgDown Ctrl+PgDown Next Program Další program Select the next instrument program Vybrat další nástrojový program PgUp PgUp Previous Program Předchozí program Select the previous instrument program Vybrat předchozí nástrojový program PgDown PgDown Velocity Up Rychlost nahoru Increment note velocity Zvýšit rychlost noty End End Velocity Down Rychlost dolů Decrement note velocity Snížit rychlost noty Load... Laden... Load another keyboard layout Lade eine andere Tastaturbelegung Save... Speichern... Save the current keyboard layout Speichere die aktuelle Tastaturbelegung &Keyboard Map &Uspořádání klávesnice Edit... Bearbeiten... Edit the current keyboard layout Upravit nynější uspořádání klávesnice &Contents &Obsah Open the index of the help document Otevřít rejstřík dokumentu s nápovědou VMPK &Web site VMPK &stránky na internetu Open the VMPK web site address using a web browser Otevřít adresu internetových stránek VMPK v prohlížeči &Import SoundFont... &Zavést zvukové písmo... vmpk-0.4.0/translations/vmpk_ru.ts0000644000175000001440000033311111572642326016306 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Версия: %1<br/>Дата сборки: %2<br/>Время сборки: %3<br/>Компилятор: %4</p></body></html> AboutClass About О программе <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Виртальная MIDI Клавиатура-пианино</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Эта программа является свободным программным обеспечением: Вы можете распространять и модифицировать её в соответствии с положениями GNU General Public License, изданной Free Software Foundation, либо третьей версии лицензии, либо (на ваше усмотрение) любой более поздней версии.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ ЛИБО ГАРАНТИЙ; не гарантируется даже, что она ПРИГОДНА К ПРОДАЖЕ или ПОДХОДИТ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Смотрите GNU General Public License, чтобы получить больше информации. Вы должны были получить копию GNU General Public License вместе с этой программой. Если нет, смотрите </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Также прилагается следующее замечание об авторских правах:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Эта программа содержит </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: классы C++ для ввода/вывода MIDI времени выполнения <br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Эта программа является свободным программным обеспечением: Вы можете распространять и модифицировать её в соответствии с положениями GNU General Public License, изданной Free Software Foundation, либо третьей версии лицензии, либо (на ваше усмотрение) любой более поздней версии.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ ЛИБО ГАРАНТИЙ; не гарантируется даже, что она ПРИГОДНА К ПРОДАЖЕ или ПОДХОДИТ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Смотрите GNU General Public License, чтобы получить больше информации. Вы должны были получить копию GNU General Public License вместе с этой программой. Если нет, смотрите </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Также прилагается следующее замечание об авторских правах:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Эта программа содержит </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: классы C++ для ввода/вывода MIDI времени выполнения <br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Copyright © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program contains <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:10pt;">Copyright © 2008-2009, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following copyright notice is also applicable:</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This program contains <a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" text-decoration: underline; color:#0057ae;">RtMIDI</span></a>: realtime MIDI i/o C++ classes<br />Copyright © 2003-2007 Gary P. Scavone</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> DialogExtraControls New Control Новый регулятор System Exclusive File Файл System Exclusive System Exclusive (*.syx) Extra Controls Editor Редактор дополнительных регуляторов Label: Метка: MIDI Controller: Регулятор MIDI: Add Добавить Remove Удалить Up Вверх Down Вниз Switch Переключатель Knob Виджет в виде регулятора, который можно крутить. Не подобрал лучшего эквивалента Ручка Spin box Счётчик Slider Ползунок Button Ctl Ктрл. кнопка Button SysEx Кнопка SysEx Default ON По умолчанию ВКЛ value ON: значение ВКЛ: value OFF: значение ВЫКЛ: Min. value: Мин. значение: Max. value: Макс. значение: Default value: По умолчанию: Display size: Размер на экране: value: значение: File name: Имя файла: ... ... KMapDialog Open... Открыть... Save As... Сохранить как... Raw Key Map Editor Редактор привязок системной клавиатуры Key Map Editor Редактор привязок клавиш Key Code Код клавиши Key Клавиша Open keyboard map definition Открыть описание привязок клавиш Keyboard map (*.xml) Привязки клавиш (*.xml) Save keyboard map definition Сохранить описание привязок клавиш KMapDialogClass Key Map Editor Редактор привязок клавиш This box displays the name of the current mapping file Это поле отображает название текущего файла привязок This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Это список привязок к клавиатуре ПК. Каждая строка имеет номер, соответствующий номеру ноты MIDI, и вы можете ввести алфавитно-цифровое название клавиши, которая будет соответствовать данной ноте 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Клавиша KeyboardMap Error loading a file Ошибка загрузки файла Error saving a file Ошибка сохранения файла Error reading XML Ошибка чтения XML File: %1 %2 Файл: %1 %2 MidiSetupClass MIDI Setup Настройка MIDI Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Установите этот флажок, чтобы разрешить ввод MIDI для программы. В Linux и Mac OSX порт ввода всегда установлен, и флажок не может быть снят Enable MIDI input Разрешить ввод MIDI Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Установите этот флажок, чтобы разрешить функцию MIDI Thru: любое событие MIDI, полученное на порте ввода будет без изменений скопировано в порт вывода Enable MIDI Thru on MIDI Output Разрешить MIDI Thru на выводе MIDI Input MIDI Connection Соединение ввода MIDI Use this control to change the connection for the MIDI input port, if it is enabled Используйте этот элемент, чтобы изменить соединение для порта ввода MIDI, если он разрешён Output MIDI Connection Соединение вывода MIDI Use this control to change the connection for the MIDI output port Используйте этот элемент, чтобы изменить соединение для порта вывода MIDI PianoScene C До C♯ До♯ D Ре D♯ Ре♯ C# До # D# Ре # E Ми F Фа F# Фа # G# Соль # A# Ля # Db Ре b Eb Ми b Gb Соль b Ab Ля b Bb Си b F♯ Фа♯ G Соль G♯ Соль♯ A Ля A♯ Ля♯ B Си D♭ Ре♭ E♭ Ми♭ G♭ Соль♭ A♭ Ля♭ B♭ Си♭ Preferences Open instruments definition Открыть описание инструментов Instrument definitions (*.ins) Описания инструментов (*.ins) Open keyboard map definition Открыть описание привязок клавиш Keyboard map (*.xml) Привязки клавиш (*.xml) PreferencesClass Preferences Параметры Number of octaves Число октав The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Число октав, от 1 до 10. В каждой октаве 12 клавиш: 7 белых и 5 чёрных. Стандарт MIDI содержит 128 нот, но не все инструменты могут играть все ноты. Key pressed color Цвет нажатой клавиши This box displays the highligh color and code used to paint the keys that are being activated. Это поле отображает цвет, используемый для закрашивания клавиш, которые были активированы. Press this button to change the highligh color used to paint the keys that are being activated. Нажмите эту кнопку, чтобы изменить цвет, используемый для закрашивания клавиш, которые были активированы. color... цвет... Instruments file Файл инструментов The instruments definition file currently loaded Файл описания инструментов, загруженный в данный момент default по умолчанию Press this button to load an instruments definition file from disk. Нажмите эту кнопку, чтобы загрузить файл описания инструментов с диска. load... загрузить... Instrument Инструмент Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Изменить описание инструмента, используемое в данный момент. Каждый файл описания инструментов может содержать несколько инструментов. Keyboard Map Привязка клавиш Load... Загрузить... Raw Keyboard Map Системная привязка клавиш Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Изменить отображение виджетов (ручек, переключателей), используя либо собственный стиль, либо определённый в qtconfig. Styled Widgets Стилизованные виджеты Check this box to keep the keyboard window always visible, on top of other windows. Установите этот флажок, чтобы окно клавиатуры было видно всегда, поверх других окон. Always On Top Поверх окон <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Установите этот флажок, чтобы захватывать клавиатуру ПК, даже если элемент управления клавиатурой не в фокусе. <span style=" font-weight:600;">Замечание для пользователей Linux:</span> эта опция хорошо работает в стандартном окружении KDE, но не работает в таких оконных менеджерах, как metacity и compiz. Также известно, что использование этой опции ломает контекстные меню в приложениях GTK.</p></body></html> Grab Computer Keyboard Захватывать клавиатуру компьютера <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Установите этот флажок, чтобы использовать низкоуровневые события клавиатуры ПК. Эта система имеет несколько преимуществ:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Возможность использовать "мёртвые клавиши" (знаки ударения, диакритические символы)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Описания привязок не зависят от языка (но зависят от аппаратуры и ОС)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Более быстрая обработка</li></ul></body></html> Raw Computer Keyboard Системная клавиатура компьютера Drums Channel Канал ударных None Нет 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 Translate MIDI velocity to key pressed color tint Переводить громкость MIDI в оттенок цвета нажатой клавиши Network Port Сетевой порт Check this box to display the note names over the piano keys. Установите этот флажок, чтобы показывать названия нот над клавишами пианино. Show Note Names Показывать названия нот QObject Cakewalk Instrument Definition File Файл Определений Инструментов Cakewalk File Файл Date Дата RiffImportDlg Input SoundFont Ввод SoundFont SoundFonts (*.sf2 *.sbk *.dls) Файлы SoundFont (*.sf2 *.sbk *.dls) Output Вывод Instrument definitions (*.ins) Описания инструментов (*.ins) Import SoundFont instruments Импорт инструментов SoundFont Input File Входной файл This text box displays the path and name of the selected SoundFont to be imported Это текстовое поле отображает путь и название выбранного файла SoundFont для импорта Press this button to select a SoundFont file to be imported Нажмите эту кнопку, чтобы выбрать файл SoundFont для импорта ... ... Name Название Version Версия Copyright Авторское право Output File Выходной файл This text box displays the name of the output file in .INS format that will be created Это текстовое поле отображает название выходного файла в формате .INS, который будет создан Press this button to select a path and file name for the output file Нажмите эту кнопку, чтобы выбрать путь и название для выходного файла ShortcutDialog Keyboard Shortcuts Клавиатурные сочетания Action Действие Description Описание Shortcut Клавиша Warning Предупреждение Keyboard shortcuts have been changed. Do you want to apply the changes? Клавиатурные сочетания изменились. Хотите применить изменения? VPiano Error Ошибка No MIDI output ports available. Aborting Нет доступных портов вывода MIDI. Завершение Error. Aborting Ошибка. Завершение Chan: Кан: Channel: Канал: Oct: Окт: Base Octave: Базовая октава: Trans: Пер: Transpose: Перенос: Vel: Громк: Velocity: Громкость: Control: Регулятор: Value: Значение: Bender: Зажим: Bank: Банк: Program: Программа: No help file found Не найден файл справки The language for this application is going to change to %1. Do you want to continue? Язык этого приложения изменится на %1. Хотите продолжить? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> <p>VMPK разрабатывается и переводится благодаря работе добровольцев со всего мира. Если Вы хотите присоединиться к команде или у Вас есть какие-нибудь вопросы, посетите форумы на <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Информация о переводе Swedish Шведский Translation Перевод <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Перевёл Сергей Басалаев &lt;sbasalaev@gmail.com&gt;</p>%1 Czech Чешский German Немецкий English Английский Spanish Испанский French Французский Dutch Голландский Russian Русский Turkish Турецкий Chinese Китайский Language Changed Язык изменён &File &Файл &Edit &Правка &Help &Справка &Language &Язык &View &Вид &Tools &Инструменты Notes Ноты Controllers Регуляторы Programs Программы &Notes &Ноты &Controllers &Регуляторы Pitch &Bender &Зажим высоты &Programs &Программы &Extra Controls &Дополнительные регуляторы &Quit В&ыход Exit the program Выйти из программы &Preferences &Параметры Edit the program settings Редактировать настройки программы &Connections &Соединения Edit the MIDI connections Редактировать соединения MIDI &About &О программе Show the About box Показать информацию об этой программе About Q&t О Q&t About &Qt О &Qt Show the Qt about box Показать информацию о Qt Show or hide the Notes toolbar Показать или скрыть панель Ноты Show or hide the Controller toolbar Показать или скрыть панель Регуляторы Show or hide the Pitch Bender toolbar Показать или скрыть Зажим высоты Show or hide the Programs toolbar Показать или скрыть панель Программы &Status Bar &Строка состояния Show or hide the Status Bar Показать или скрыть строку состояния Panic Паника Stops all active notes Останавливает все активные ноты Esc Esc Reset All Сбросить всё Resets all the controllers Сбросить все регуляторы Reset Сбросить Resets the Bender value Сбрасывает значение Зажима &Keyboard Map Привязки &клавиш Edit the current keyboard layout Редактировать текущую раскладку клавиатуры &Contents &Содержание Open the index of the help document Открыть индекс документа справки F1 F1 VMPK &Web site &Веб-сайт VMPK Open the VMPK web site address using a web browser Открыть веб-сайт VMPK используя веб-браузер &Import SoundFont... &Импортировать SoundFont... Import SoundFont Импортировать SoundFont Show or hide the Extra Controls toolbar Показать или скрыть панель дополнительных регуляторов Edit Правка Open the Extra Controls editor Открыть редактор дополнительных регуляторов Open the Banks/Programs editor Открыть редактор Банков/Программ &Extra Controllers &Дополнительные регуляторы N&ote Names Н&азвания нот Show or hide the note names Показать или скрыть названия нот &Shortcuts К&лавиатурные сочетания Open the Shortcuts editor Открыть редактор клавиатурных сочетаний Octave Up Повысить октаву Play one octave higher Играть на одну октаву выше Octave Down Понизить октаву Play one octave lower Играть на одну октаву ниже Transpose Up Переместиться вверх Transpose one semitone higher Переместиться на полутон выше Transpose Down Переместиться вниз Transpose one semitone lower Переместиться на полутон ниже Next Channel Следующий канал Play and listen next channel Проигрывать и прослушивать следующий канал Previous Channel Предыдущий канал Play and listen previous channel Проигрывать и прослушивать предыдущий канал About &Translation О &переводе Show information about the program language translation Показать информацию о переводе программы Next Controller Следующий регулятор Select the next controller Выбрать следующий регулятор Previous Controller Предыдущий регулятор Select the previous controller Выбрать предыдущий регулятор Controller Up Повысить регулятор Increment the controller value Увеличить значение регулятора Controller Down Понизить регулятор Decrement the controller value Уменьшить значение регулятора Next Bank Следующий банк Select the next instrument bank Выбрать следующий банк инструментов Previous Bank Предыдущий банк Select the previous instrument bank Выбрать предыдущий банк инструментов Next Program Следующая программа Select the next instrument program Выбрать следующую программу инструментов PgUp PgUp Previous Program Предыдущая программа Select the previous instrument program Выбрать предыдущую программу инструментов PgDown PgDown Velocity Up Увеличить громкость Increment note velocity Увеличить громкость нот End End Velocity Down Уменьшить громкость Decrement note velocity Уменьшить громкость нот vmpk-0.4.0/translations/vmpk_de.ts0000644000175000001440000030516111572642326016254 0ustar pedrousers About <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; }</style></head><body style="font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;"><p style="margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version: %1<br/>Build date: %2<br/>Build time: %3<br/>Compiler: %4</p></body></html> AboutClass About Über <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm ist Opensource Software: es kann weitergegeben und/oder geändert werden unter den Bedingungen der GNU Allgemeinen Öffentlichen Lizenz (GPL), publiziert durch die Free Software Foundation, entweder Version 3 der Lizenz, oder (wahlweise) unter jeder darauf folgenden Version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm wird veröffentlicht in der Hoffnung, daß es nützlich ist, jedoch OHNE JEDE GEWÄHRLEISTUNG. Es besteht auch KEINE implizite Gewähr auf MARKTVERTRÄGLICHKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details finden Sie in der GNU Öffentlichen Lizenz (GPL), von der Sie eine Kopie mit diesem Programm erhalten haben. Sollte dies nicht der Fall sein, können Sie sie finden bei </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Die folgende Copyright-Notiz ist ebenfalls wirksam:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm enthält </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ Klassen<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> {3C?} {4.0/?} {3.?} {40/?} {1"?} {10p?} {400;?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {2008-2011,?} {9p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {3 ?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {12p?} {12p?} {0p?} {0p?} {0;?} {0p?} {0057a?} {2003-2010 ?} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2010, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm ist Opensource Software: es kann weitergegeben und/oder geändert werden unter den Bedingungen der GNU Allgemeinen Öffentlichen Lizenz (GPL), publiziert durch die Free Software Foundation, entweder Version 3 der Lizenz, oder (wahlweise) unter jeder darauf folgenden Version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm wird veröffentlicht in der Hoffnung, daß es nützlich ist, jedoch OHNE JEDE GEWÄHRLEISTUNG. Es besteht auch KEINE implizite Gewähr auf MARKTVERTRÄGLICHKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details finden Sie in der GNU Öffentlichen Lizenz (GPL), von der Sie eine Kopie mit diesem Programm erhalten haben. Sollte dies nicht der Fall sein, können Sie sie finden bei </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Die folgende Copyright-Notiz ist ebenfalls wirksam:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Dieses Programm enthält </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ Klassen<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> DialogExtraControls New Control Neue Steuerung System Exclusive File System Exclusive Datei System Exclusive (*.syx) Extra Controls Editor Zusatz-Steuerungseditor Label: Beschriftung: MIDI Controller: MIDI Controller: Add Hinzufügen Remove Entfernen Up Auf Down Ab Switch Schalter Knob Drehregler Spin box Slider Schieberegler Button Ctl Sendeknopf Einzelcontroller Button SysEx Sendeknopf SysEx Default ON Ursprüngl.: AN value ON: Wert AN: value OFF: Wert AUS: Min. value: Minimalwert: Max. value: Maximalwert: Default value: Ursprungswert: Display size: Anzeigegröße: value: Wert: File name: Zu sendende Datei: ... KMapDialog Open... Öffnen... Save As... Speichern unter... Raw Key Map Editor Tastenbelegungseditor - Rohdaten Key Map Editor Tastaturbelegungseditor Key Code Tastaturcode Key Taste Open keyboard map definition Tastaturbelegungsdatei öffnen Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Save keyboard map definition Tastaturbelegung speichern KMapDialogClass Key Map Editor Tastaturbelegungseditor This box displays the name of the current mapping file Diese Box zeigt den Namen der aktuell verwendeten Belegungsdatei an This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note Dies ist die Liste der PC Tastenbelegung. Jede Reihe hat eine Zahl, die zu einer Note gehört, es muss ein alphanumerischer Tastenname eingetragen werden, der für die gewünschte Note steht 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Taste KeyboardMap Error loading a file Fehler beim Laden der Datei Error saving a file Fehler beim Speichern der Datei Error reading XML Fehler beim lesen der XML Datei File: %1 %2 Datei: %1 %2 MidiSetupClass MIDI Setup MIDI Einstellungen Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Diese Auswahl selektieren um die MIDI Eingabe für das Programm einzuschalten. Unter Linux und MacOS X ist die Eingabe immer aktiviert und kann nicht deaktiviert werden Enable MIDI input MIDI-Eingang aktivieren Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Diese Auswahl aktiviert die MIDI Durchleitungsoption, die jedes eingehende Signal auch automatisch an den Ausgang kopiert Enable MIDI Thru on MIDI Output MIDI Durchleitung zum MIDI-Ausgang aktivieren Input MIDI Connection Verbindung des MIDI-Eingangs Use this control to change the connection for the MIDI input port, if it is enabled Mit dieser Auswahlliste kann die aktuelle MIDI Eingangsbelegung geändert werden Output MIDI Connection Verbindung des MIDI-Ausgangs Use this control to change the connection for the MIDI output port Mit dieser Auswahlliste kann die aktuelle MIDI Ausgangsbelegung geändert werden PianoScene C C C♯ C♯ D D D♯ D♯ C# D# E E F F F# G# A# Db Eb Gb Ab Bb F♯ F♯ G G G♯ G♯ A A A♯ A♯ B H D♭ D♭ E♭ E♭ G♭ G♭ A♭ A♭ B♭ B Preferences Open instruments definition Instrumentdefinitionsdatei öffnen Instrument definitions (*.ins) Instrumentdefinitionen (*.ins) Open keyboard map definition Tastaturbelegungsdatei öffnen Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) PreferencesClass Preferences Einstellungen Number of octaves Anzahl der Oktaven The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. Die Anzahl der Oktaven, von 1 bis 10. Jede Oktave hat 12 Tasten: 7 weiße und 5 schwarze. Der MIDI-Standard hat 128 Noten, aber nicht alle Instrumente können alle davon spielen. Key pressed color Farbe gedrückter Tasten This box displays the highligh color and code used to paint the keys that are being activated. Diese Auswahl zeigt die Markierungsfarbe und den Farbcode die zum zeichnen gedrückter Tasten benutzt werden soll. Press this button to change the highligh color used to paint the keys that are being activated. Mit diesem Knopf kann man die Markierungsfarbe ändern, mit der die gedrückten Tasten angezeigt werden. color... Ändern... Instruments file Instrument-Datei The instruments definition file currently loaded Die momentan geladene Instrumentdefinitionsdatei default Standard Press this button to load an instruments definition file from disk. Mit diesem Knopf kann man eine Instrumentendefinitionsdatei von der Festplatte laden. load... Öffnen... Instrument Instrument Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Ändert die momentan verwendete Instrumentdefinition. Jede Instrumentdefinitionsdatei kann mehrere Instrumente beinhalten. Keyboard Map Tastenbelegung Load... Öffnen... Raw Keyboard Map There is no good/short way to translate this to german :-/ Tastenbelegung - Rohdaten Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Den Stil der Drehregler und Schalter ändern, entweder den eigenen oder den in qtconfig bestimmten Stil verwenden. Styled Widgets Eigener Bedienelemente-Stil <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dies ankreuzen, um die Rohdaten der Tastatur zu verwenden. Dieses System hat mehrere Vorteile:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es ist möglich, auch Steuertasten zu verwenden, z.B Akzent- und Sondertasten)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Die Zuweisungsdefinitionen sind unabhängig von der Sprache, aber nicht von Hardware und Betriebssystem)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Schnellere Bearbeitung</li></ul></body></html> Drums Channel Drumkit Kanal None Kein Kanal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Translate MIDI velocity to key pressed color tint MIDI Anschlagsdynamik bestimmt die Tastenfarbe Network Port Netzwerk Port Change the knob buttons style, either using the custom look or revert to the style selected in qtconfig. Mit dieser Option kann man das Aussehen der Knöpfe verändern; entweder der eigene Stil oder das Standardaussehen. Styled Knobs Stylische Knöpfe Check this box to keep the keyboard window always visible, on top of other windows. Diese Option hebt das Tastaturfenster in den Vordergrund und behält es immer über allen anderen Fenstern. Always On Top Im Vordergrund bleiben <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> Diese Option fängt die Tastatur ein, sodaß jeder Tastendruck unmittelbar an die Anwendung gesendet wird. (Unter Linux funktioniert dies nur unter KDE) Grab Computer Keyboard Computertastatur behalten Raw Computer Keyboard Computertastatur-Rohdaten verwenden Grab keyboard Tastatur einfangen Check this box to display the note names over the piano keys. Diese Option stellt die Notennamen auf den Tasten dar. Show Note Names Notennamen anzeigen QObject Cakewalk Instrument Definition File Cakewalk Instrumentendefinitionsdatei File Datei Date Datum RiffImportDlg Input SoundFont Eingabedatei (SoundFont) SoundFonts (*.sf2 *.sbk *.dls) SoundFont-Dateien (*.sf2 *.sbk *.dls) Output Ausgabedatei Instrument definitions (*.ins) Instrumentdefinitionen (*.ins) Import SoundFont instruments SoundFont importieren Input File Eingabedatei This text box displays the path and name of the selected SoundFont to be imported Dieses Eingabefeld gibt den Pfad und den Namen der ausgewählten Musikschriftart an, die importiert werden soll Press this button to select a SoundFont file to be imported Hier klicken, um eine SoundFont-Datei zu importieren ... Name Version Copyright Output File Ausgabedatei This text box displays the name of the output file in .INS format that will be created Dieses Eingabefeld zeigt den Namen der zu erstellenden Ausgabedatei im .INS Format an Press this button to select a path and file name for the output file Hier kann man den Pfad und die Datei für die Ausgabedatei auswählen ShortcutDialog Keyboard Shortcuts Tastenkürzel Action Aktion Description Beschreibung Shortcut Kürzel Warning Warnung Keyboard shortcuts have been changed. Do you want to apply the changes? Die Tastenkürzel wurden geändert. Wollen Sie die Änderungen anwenden? VPiano Error Fehler No MIDI output ports available. Aborting Keine MIDI-Ausgänge verfügbar. Breche ab Error. Aborting Fehler. Breche ab Chan: Kan: Channel: Kanal: Oct: Okt: Base Octave: Basisoktave: Trans: Transpose: Transponieren: Vel: Velocity: Anschlag: Control: Controller: Value: Wert: Bender: Pitchbend: Bank: Program: Programm: The language for this application is going to change to %1. Do you want to continue? Möchten Sie, daß diese Anwendung im folgenden %1 spricht? <p>VMPK is developed and translated thanks to the volunteer work of many people from around the world. If you want to join the team or have any question, please visit the forums at <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> VMPK wird entwickelt und übersetzt Dank der freiwilligen Arbeit vieler Leute aus mehreren Ländern. Wenn Sie dem Team beitreten wollen, oder sonstige Fragen haben, konsultieren Sie bitte die Foren auf <a href='http://sourceforge.net/projects/vmpk/forums'>SourceForge</a></p> Translation Information Über die Übersetzung Swedish Schwedisch Translation Übersetzung <p>Translation by TRANSLATOR_NAME_AND_EMAIL</p>%1 <p>Übersetzt von Frank Kober (emuse@users.sourceforge.net) </p>%1 Czech Tschechisch German Deutsch English Englisch Spanish Spanisch French Französisch Dutch Holländisch Russian Russisch Turkish Türkisch Chinese Chinesisch Language Changed Sprache wurde geändert Channel: Kanal: Base Octave: Basisoktave: Transpose: Transponieren: Velocity: Geschwindigkeit: Control: Kontrolle: Value: Wert: Program: Programm: Open keyboard map definition Öffne Tastaturbelegungsdatei Keyboard map (*.xml) Tastaturbelegungsdatei (*.xml) Save keyboard map definition Speichere Tastaturbelegung No help file found Es konnte keine Hilfe-Datei gefunden werden Virtual Piano Keyboard Virtuelle Piano-Tastatur &File &Datei &Edit &Bearbeiten Keyboard map Tastaturbelegung &Help &Hilfe &Language &Sprache &View &Ansicht &Tools &Werkzeuge Notes Noten Controllers Steuerungen Programs Programme &Notes &Noten &Controllers &Steuerungen Pitch &Bender &Programs &Programme &Extra Controls &Zusatzsteuerungen &Quit &Beenden Exit the program Das Programm beenden &Preferences &Einstellungen Edit the program settings Die Programmeinstellungen ändern &Connections MIDI-&Verbindungen Edit the MIDI connections Die MIDI-Verbindungen ändern &About &Über Show the About box Zeigt Informationen über das Programm an About Q&t Über Q&t About &Qt Über &Qt Show the Qt about box Zeigt QT Informationen Show or hide the Notes toolbar Zeigen oder Verstecken der Noten-Werkeugleiste Show or hide the Controller toolbar Zeigen oder Verstecken der Steuerungs-Werkzeugleiste Show or hide the Pitch Bender toolbar Zeigen oder Verstecken der Pitch Bender Werkzeugleiste Show or hide the Programs toolbar Zeigen oder Verstecken der Programm Werkzeugleiste &Status Bar &Statuszeile Show or hide the Status Bar Die Statusleiste ein- oder ausblenden Panic Stops all active notes Stopp alle aktiven Noten Reset All Alles zurücksetzen Resets all the controllers Alle Steuerungen zurücksetzen Reset Zurücksetzen Resets the Bender value Bender Wert zurücksetzen Import SoundFont SoundFont Importieren Show or hide the Extra Controls toolbar Werkzeugleiste "Zusatz-Steuerungen" ein- oder ausblenden Edit Bearbeiten Open the Extra Controls editor Zusatzsteuerungs-Editor anzeigen Open the Banks/Programs editor Bank/Programm-Editor anzeigen &Extra Controllers &Zusatzsteuerungen N&ote Names N&oten-Namen Show or hide the note names Notennamen ein- oder ausblenden &Shortcuts &Tastaturkürzel Open the Shortcuts editor Tastaturkürzel ändern Octave Up Oktave höher Play one octave higher Eine Oktave höher spielen Right Rechts Octave Down Oktave tiefer Play one octave lower Eine Oktave tiefer spielen Left Links Transpose Up Hoch transponieren Transpose one semitone higher Einen Halbton hoch transponieren Ctrl+Right Ctrl+Rechts Transpose Down Herunter transponieren Transpose one semitone lower Einen Halbton herunter transponieren Ctrl+Left Ctrl+Links Next Channel Nächster Kanal Play and listen next channel Den nächsten Kanal spielen und hören Previous Channel Vorheriger Kanal Play and listen previous channel Den vorherigen Kanal spielen und hören About &Translation Über die &Übersetzung Show information about the program language translation Zeigt Informationen über die Sprachübersetzung des Programms Up Auf Down Ab Next Controller Nächste Steuerung Select the next controller Die Nächste Steuerung auswählen Previous Controller Vorherige Steuerung Select the previous controller Die vorherige Steuerung auswählen Controller Up Steuerung Auf Increment the controller value Den Steuerungswert erhöhen Controller Down Steuerung Ab Decrement the controller value Den Steuerungswert senken Next Bank Nächste Bank Select the next instrument bank Die nächste Instrumenten Bank auswählen Previous Bank Vorherige Bank Select the previous instrument bank Die vorherige Instrumenten Bank auswählen Next Program Nächstes Programm Select the next instrument program Das nächste Instrumenten Programm auswählen Previous Program Vorheriges Programm Select the previous instrument program Das vorherige Instrumenten Programm auswählen Velocity Up Anschlag Auf Increment note velocity Die Anschlagsdynamik erhöhen End Ende Velocity Down Anschlag Ab Decrement note velocity Die Anschlagsdynamik senken Load... Laden... Load another keyboard layout Lade eine andere Tastaturbelegung Save... Speichern... Save the current keyboard layout Speichere die aktuelle Tastaturbelegung &Keyboard Map &Tastenbelegung Edit... Bearbeiten... Edit the current keyboard layout Die aktuelle Tastaturbelegung bearbeiten &Contents &Inhalt Open the index of the help document Den Index des Hilfe-Dokumentes öffnen VMPK &Web site VMPK &Webseite aufrufen Open the VMPK web site address using a web browser Öffnet die VMPK Webseite in einem Browser &Import SoundFont... Soundfont &importieren... vmpk-0.4.0/vmpk.desktop0000644000175000001440000000050211572642326014075 0ustar pedrousers[Desktop Entry] Name=VMPK Exec=vmpk Icon=vmpk Terminal=false Type=Application Categories=AudioVideo;Audio;Midi;Education;Music; Comment=Virtual MIDI Piano Keyboard Comment[es]=Teclado de piano MIDI virtual Comment[ru]=Виртуальная MIDI Клавиатура-Пианино Comment[tr]=Sanal MIDI Piyano Klavyesi vmpk-0.4.0/gpl.rtf0000644000175000001440000024150411572642326013035 0ustar pedrousers{\rtf1\ansi\deff1\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Thorndale AMT{\*\falt Times New Roman};}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Albany AMT{\*\falt Arial};}{\f3\froman\fprq2\fcharset0 Times New Roman;}{\f4\froman\fprq2\fcharset0 Cambria;}{\f5\fmodern\fprq1\fcharset0 Courier New;}{\f6\froman\fprq0\fcharset0 Consolas;}{\f7\froman\fprq2\fcharset2 Symbol;}{\f8\fnil\fprq2\fcharset2 Wingdings;}{\f9\fnil\fprq2\fcharset0 Albany AMT{\*\falt Arial};}{\f10\fnil\fprq2\fcharset0 Lucidasans;}{\f11\fnil\fprq0\fcharset0 Lucidasans;}} {\colortbl;\red0\green0\blue0;\red79\green129\blue189;\red128\green128\blue128;} {\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\snext1 Normal;} {\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs28\lang1025\ltrch\dbch\af9\langfe3082\hich\f2\fs28\lang3082\loch\f2\fs28\lang3082\sbasedon1\snext3 Heading;} {\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon1\snext3 Body Text;} {\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af11\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon3\snext4 List;} {\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af11\afs24\lang1025\ai\ltrch\dbch\langfe3082\hich\fs24\lang3082\i\loch\fs24\lang3082\i\sbasedon1\snext5 caption;} {\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af11\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon1\snext6 Index;} {\s7\sb100\sa100\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b\sbasedon1\snext7{\*\soutlvl2} heading 3;} {\s8\sb100\sa100\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b\sbasedon1\snext8{\*\soutlvl3} heading 4;} {\s9\sb100\sa100\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082\sbasedon1\snext9 Normal (Web);} {\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082\sbasedon1\snext10 HTML Preformatted;} {\*\cs12\cf0\rtlch\af7\afs20\lang3082\ltrch\dbch\af7\langfe3082\hich\f7\fs20\lang3082\loch\f7\fs20\lang3082 RTF_Num 2 1;} {\*\cs13\cf0\rtlch\af5\afs20\lang3082\ltrch\dbch\af5\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 RTF_Num 2 2;} {\*\cs14\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 3;} {\*\cs15\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 4;} {\*\cs16\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 5;} {\*\cs17\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 6;} {\*\cs18\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 7;} {\*\cs19\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 8;} {\*\cs20\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 2 9;} {\*\cs21\cf0\rtlch\af7\afs20\lang3082\ltrch\dbch\af7\langfe3082\hich\f7\fs20\lang3082\loch\f7\fs20\lang3082 RTF_Num 3 1;} {\*\cs22\cf0\rtlch\af5\afs20\lang3082\ltrch\dbch\af5\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 RTF_Num 3 2;} {\*\cs23\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 3;} {\*\cs24\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 4;} {\*\cs25\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 5;} {\*\cs26\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 6;} {\*\cs27\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 7;} {\*\cs28\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 8;} {\*\cs29\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 3 9;} {\*\cs30\cf0\rtlch\af7\afs20\lang3082\ltrch\dbch\af7\langfe3082\hich\f7\fs20\lang3082\loch\f7\fs20\lang3082 RTF_Num 4 1;} {\*\cs31\cf0\rtlch\af5\afs20\lang3082\ltrch\dbch\af5\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 RTF_Num 4 2;} {\*\cs32\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 3;} {\*\cs33\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 4;} {\*\cs34\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 5;} {\*\cs35\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 6;} {\*\cs36\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 7;} {\*\cs37\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 8;} {\*\cs38\cf0\rtlch\af8\afs20\lang3082\ltrch\dbch\af8\langfe3082\hich\f8\fs20\lang3082\loch\f8\fs20\lang3082 RTF_Num 4 9;} {\*\cs39\cf0\rtlch\af1\afs24\lang3082\ltrch\dbch\af1\langfe3082\hich\f1\fs24\lang3082\loch\f1\fs24\lang3082 Default Paragraph Font;} {\*\cs40\cf2\rtlch\af4\afs24\lang3082\ab\ltrch\dbch\langfe3082\hich\f4\fs24\lang3082\b\loch\f4\fs24\lang3082\b\sbasedon39 Heading 3 Char;} {\*\cs41\cf2\rtlch\af4\afs24\lang3082\ai\ab\ltrch\dbch\langfe3082\hich\f4\fs24\lang3082\i\b\loch\f4\fs24\lang3082\i\b\sbasedon39 Heading 4 Char;} {\*\cs42\cf0\rtlch\af6\afs24\lang3082\ltrch\dbch\langfe3082\hich\f6\fs24\lang3082\loch\f6\fs24\lang3082\sbasedon39 HTML Preformatted Char;} }{\*\listtable{\list\listtemplateid1 {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f7\fs20\f7\fs20\f7\fs20\f7\fi-360\li720} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f5\fs20\f5\fs20\f5\fs20\f5\fi-360\li1440} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2160} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2880} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li3600} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li4320} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5040} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5760} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li6480}{\listname RTF_Num 4;}\listid1} {\list\listtemplateid2 {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f7\fs20\f7\fs20\f7\fs20\f7\fi-360\li720} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f5\fs20\f5\fs20\f5\fs20\f5\fi-360\li1440} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2160} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2880} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li3600} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li4320} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5040} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5760} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li6480}{\listname RTF_Num 3;}\listid2} {\list\listtemplateid3 {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61623 ?;}{\levelnumbers;}\f7\fs20\f7\fs20\f7\fs20\f7\fi-360\li720} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u111 ?;}{\levelnumbers;}\f5\fs20\f5\fs20\f5\fs20\f5\fi-360\li1440} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2160} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li2880} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li3600} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li4320} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5040} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li5760} {\listlevel\levelnfc23\leveljc0\levelstartat1\levelfollow0{\leveltext \'01\u61607 ?;}{\levelnumbers;}\f8\fs20\f8\fs20\f8\fs20\f8\fi-360\li6480}{\listname RTF_Num 2;}\listid3} }{\listoverridetable{\listoverride\listid1\listoverridecount0\ls0}{\listoverride\listid2\listoverridecount0\ls1}{\listoverride\listid3\listoverridecount0\ls2}} {\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab708 {\*\pgdsctbl {\pgdsc0\pgdscuse195\pgwsxn11906\pghsxn16838\marglsxn1701\margrsxn1701\margtsxn1417\margbsxn1417\pgdscnxt0 Standard;}} {\*\pgdscno0}\paperh16838\paperw11906\margl1701\margr1701\margt1417\margb1417\sectd\sbknone\pgwsxn11906\pghsxn16838\marglsxn1701\margrsxn1701\margtsxn1417\margbsxn1417\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc \pard\plain \ltrpar\s7\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b GNU GENERAL PUBLIC LICENSE} \par \pard\plain \ltrpar\s9\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Version 3, 29 June 2007} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Copyright \'a9 2007 Free Software Foundation, Inc. } \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.} \par \pard\plain \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b {\*\bkmkstart preamble}{\*\bkmkend preamble}Preamble} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The GNU General Public License is a free, copyleft license for software and other kinds of works.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program-- to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, t oo.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect t he freedom of others.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them thes e terms so they know their rights.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attr ibuted erroneously to authors of previous versions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The sy stematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The precise terms and conditions for copying, distribution and modification follow.} \par \pard\plain \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b {\*\bkmkstart terms}{\*\bkmkend terms}TERMS AND CONDITIONS} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section0}{\*\bkmkend section0}0. Definitions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 This License\'94 refers to version 3 of the GNU General Public License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Copyright\'94 also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Program\'94 refers to any copyrightable work licensed under this License. Each licensee is addressed as \'93you\'94. \'93Licensees\'94 and \'93recipients\'94 may be individuals or organizations.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To \'93modify\'94 a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \'93modified version\'94 of the earlier work or a work \'93based on\'94 the earli er work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93covered work\'94 means either the unmodified Program or a work based on the Program.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To \'93propagate\'94 a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To \'93convey\'94 a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 An interactive user interface displays \'93Appropriate Legal Notices\'94 to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list m eets this criterion.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section1}{\*\bkmkend section1}1. Source Code.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The \'93source code\'94 for a work means the preferred form of the work for making modifications to it. \'93Object code\'94 means any non-source form of a work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93Standard Interface\'94 means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that la nguage.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The \'93System Libraries\'94 of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the w ork with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A \'93Major Component\'94, in this context, means a major essential component (kernel, window system, and so on) of th e specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The \'93Corresponding Source\'94 for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not in clude the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition fi les associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms a nd other parts of the work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Corresponding Source for a work in source code form is that same work.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section2}{\*\bkmkend section2}2. Basic Permissions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section3}{\*\bkmkend section3}3. Protecting Users' Legal Rights From Anti-Circumvention Law.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention o f such measures.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intentio n to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section4}{\*\bkmkend section4}4. Conveying Verbatim Copies.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section5}{\*\bkmkend section5}5. Conveying Modified Source Versions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 a) The work must carry prominent notices stating that you modified it, and giving a relevant date.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \'93keep intact all notices\'94.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardl ess of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution med ium, is called an \'93aggregate\'94 if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause thi s License to apply to the other parts of the aggregate.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section6}{\*\bkmkend section6}6. Conveying Non-Source Forms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no mo re than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord w ith subsection 6b.} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you ma intain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements .} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93User Product\'94 is either (1) a \'93consumer product\'94, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \'93normally used\'94 refers to a typical or common use of that class of product, regardless of the status of the parti cular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such u ses represent the only significant mode of use of the product.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Installation Information\'94 for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Sour ce. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been mo dified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section7}{\*\bkmkend section7}7. Additional Terms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch \'93}{\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Additional permissions\'94 are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this Lic ense, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to t he additional permissions.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You m ay place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 d) Limiting the use for publicity purposes of names of licensors or authors of the material; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or} \par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sb100\sa100\fs24\lang1025\aspalpha\f7\fs20\f7\fs20\f7\fs20 \u61623\'3f\tab}\ilvl0 \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li720\ri0\lin720\rin0\fi-360\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 All other non-permissive additional terms are considered \'93further restrictions\'94 within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided t hat the further restriction does not survive such relicensing or conveying.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section8}{\*\bkmkend section8}8. Termination.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the cop yright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new l icenses for the same material under section 10.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section9}{\*\bkmkend section9}9. Acceptance Not Required for Having Copies.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptanc e. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptan ce of this License to do so.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section10}{\*\bkmkend section10}10. Automatic Licensing of Downstream Recipients.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this Li cense.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 An \'93entity transaction\'94 is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not ini tiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section11}{\*\bkmkend section11}11. Patents.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A \'93contributor\'94 is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \'93contributor version\'94.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A contributor's \'93essential patent claims\'94 are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its cont ributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \'93control\'94 includes the right to grant patent sublicenses in a manner consistent wi th the requirements of this License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. } \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 In the following three paragraphs, a \'93patent license\'94 is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \'93grant\'94 such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other read ily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \'93Knowingly relying\'94 means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a co untry, would infringe one or more identifiable patents in that country that you have reason to believe are valid.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 A patent license is \'93discriminatory\'94 if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection wi th specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section12}{\*\bkmkend section12}12. No Surrender of Others' Freedom.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneousl y your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section13}{\*\bkmkend section13}13. Use with the GNU Affero General Public License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The te rms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section14}{\*\bkmkend section14}14. Revised Versions of this License.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \'93or any later version\'94 applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section15}{\*\bkmkend section15}15. Disclaimer of Warranty.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \'93AS IS\'94 WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLU DING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section16}{\*\bkmkend section16}16. Limitation of Liability.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONS EQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS ), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.} \par \pard\plain \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ab\ltrch\dbch\langfe3082\hich\fs24\lang3082\b\loch\fs24\lang3082\b {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b {\*\bkmkstart section17}{\*\bkmkend section17}17. Interpretation of Sections 15 and 16.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connect ion with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 END OF TERMS AND CONDITIONS} \par \pard\plain \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs27\lang1025\ab\ltrch\dbch\langfe3082\hich\fs27\lang3082\b\loch\fs27\lang3082\b {\rtlch \ltrch\loch\f1\fs27\lang3082\i0\b {\*\bkmkstart howto}{\*\bkmkend howto}How to Apply These Terms to Your New Programs} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the \'93copyright\'94 line and a pointer to where the full notice is found.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 } \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 Copyright (C) } \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This program is free software: you can redistribute it and/or modify} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 it under the terms of the GNU General Public License as published by} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 the Free Software Foundation, either version 3 of the License, or} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 (at your option) any later version.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This program is distributed in the hope that it will be useful,} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 but WITHOUT ANY WARRANTY; without even the implied warranty of} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 GNU General Public License for more details.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 You should have received a copy of the GNU General Public License} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 along with this program. If not, see .} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 Also add information on how to contact you by electronic and paper mail.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 Copyright (C) } \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 This is free software, and you are welcome to redistribute it} \par \pard\plain \ltrpar\s10\cf0\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af5\afs20\lang1025\ltrch\dbch\langfe3082\hich\f5\fs20\lang3082\loch\f5\fs20\lang3082 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f5\fs20\lang3082\i0\b0 under certain conditions; type `show c' for details.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an \'93about box\'94.} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 You should also get your employer (if you work as a programmer) or school, if any, to sign a \'93copyright disclaimer\'94 for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see .} \par \pard\plain \ltrpar\s9\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb100\sa100\ql\rtlch\afs24\lang1025\ltrch\dbch\langfe3082\hich\fs24\lang3082\loch\fs24\lang3082 {\rtlch \ltrch\loch\f1\fs24\lang3082\i0\b0 The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you w ant to do, use the GNU Lesser General Public License instead of this License. But first, please read .} \par }vmpk-0.4.0/setup-mingw.nsi0000644000175000001440000002140411572642326014523 0ustar pedrousersName "Virtual MIDI Piano Keyboard" # Defines !define QTFILES "D:\QtSDK\Desktop\Qt\4.7.3\mingw\bin" !define QTLANG "D:\QtSDK\Desktop\Qt\4.7.3\mingw\translations" !define MINGWFILES "D:\QtSDK\Desktop\Qt\4.7.3\mingw\bin" !define VMPKSRC "D:\Projects\vmpk" !define VMPKBLD "D:\Projects\vmpk-build-desktop-release" !define REGKEY "SOFTWARE\$(^Name)" !define VERSION 0.4.0 !define COMPANY VMPK !define URL http://vmpk.sourceforge.net/ # MUI defines !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup !define MUI_STARTMENUPAGE_DEFAULTFOLDER Vmpk !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !define MUI_UNFINISHPAGE_NOAUTOCLOSE # Included files !include Sections.nsh !include MUI.nsh !include Library.nsh # Variables Var StartMenuGroup # Installer pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE gpl.rtf !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES # Installer languages !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "Swedish" # Installer attributes OutFile vmpk-${VERSION}-win32-setup.exe InstallDir $PROGRAMFILES\vmpk CRCCheck on XPStyle on ShowInstDetails show VIProductVersion 0.4.0.0 VIAddVersionKey ProductName VMPK VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" VIAddVersionKey CompanyWebsite "${URL}" VIAddVersionKey FileVersion "${VERSION}" VIAddVersionKey FileDescription "Virtual MIDI Piano Keyboard" VIAddVersionKey LegalCopyright "Copyright (C) 2008-2011 Pedro Lopez-Cabanillas and others" InstallDirRegKey HKLM "${REGKEY}" Path ShowUninstDetails show Icon src/vmpk.ico # Installer sections Section -Main SEC0000 SetOutPath $INSTDIR SetOverwrite on File ${VMPKSRC}\qt.conf File ${VMPKBLD}\release\vmpk.exe File ${VMPKSRC}\data\spanish.xml File ${VMPKSRC}\data\german.xml File ${VMPKSRC}\data\azerty.xml File ${VMPKSRC}\data\it-qwerty.xml File ${VMPKSRC}\data\vkeybd-default.xml File ${VMPKSRC}\data\pc102win.xml File ${VMPKSRC}\data\gmgsxg.ins File ${VMPKSRC}\data\help.html File ${VMPKSRC}\data\help_de.html File ${VMPKSRC}\data\help_es.html File ${VMPKSRC}\data\help_nl.html File ${VMPKSRC}\data\help_ru.html File ${VMPKBLD}\vmpk_cs.qm File ${VMPKBLD}\vmpk_de.qm File ${VMPKBLD}\vmpk_es.qm File ${VMPKBLD}\vmpk_fr.qm File ${VMPKBLD}\vmpk_nl.qm File ${VMPKBLD}\vmpk_ru.qm File ${VMPKBLD}\vmpk_sv.qm File ${VMPKBLD}\vmpk_zh_CN.qm File ${QTLANG}\qt_cs.qm File ${QTLANG}\qt_de.qm File ${QTLANG}\qt_es.qm File ${QTLANG}\qt_fr.qm File ${QTLANG}\qt_ru.qm File ${QTLANG}\qt_sv.qm File ${QTLANG}\qt_zh_CN.qm # Installing library mingwm10.dll !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${MINGWFILES}\mingwm10.dll $INSTDIR\mingwm10.dll $INSTDIR # Installing library libgcc_s_dw2-1.dll !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${MINGWFILES}\libgcc_s_dw2-1.dll $INSTDIR\libgcc_s_dw2-1.dll $INSTDIR # Installing library QtCore4.dll !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\QtCore4.dll $INSTDIR\QtCore4.dll $INSTDIR # Installing library QtGui4.dll !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\QtGui4.dll $INSTDIR\QtGui4.dll $INSTDIR # Installing library QtXml4.dll !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\QtXml4.dll $INSTDIR\QtXml4.dll $INSTDIR # Installing library QtSvg4.dll !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${QTFILES}\QtSvg4.dll $INSTDIR\QtSvg4.dll $INSTDIR WriteRegStr HKLM "${REGKEY}\Components" Main 1 SectionEnd Section -post SEC0001 WriteRegStr HKLM "${REGKEY}" Path $INSTDIR SetOutPath $INSTDIR WriteUninstaller $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup SetOutPath $SMPROGRAMS\$StartMenuGroup CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" $INSTDIR\uninstall.exe CreateShortcut "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" $INSTDIR\vmpk.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}" WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1 SectionEnd # Macro for selecting uninstaller sections !macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID Push $R0 ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}" StrCmp $R0 1 0 next${UNSECTION_ID} !insertmacro SelectSection "${UNSECTION_ID}" GoTo done${UNSECTION_ID} next${UNSECTION_ID}: !insertmacro UnselectSection "${UNSECTION_ID}" done${UNSECTION_ID}: Pop $R0 !macroend # Uninstaller sections Section /o -un.Main UNSEC0000 Delete /REBOOTOK $INSTDIR\qt.conf Delete /REBOOTOK $INSTDIR\qt_cs.qm Delete /REBOOTOK $INSTDIR\qt_de.qm Delete /REBOOTOK $INSTDIR\qt_es.qm Delete /REBOOTOK $INSTDIR\qt_fr.qm Delete /REBOOTOK $INSTDIR\qt_ru.qm Delete /REBOOTOK $INSTDIR\qt_sv.qm Delete /REBOOTOK $INSTDIR\qt_zh_CN.qm Delete /REBOOTOK $INSTDIR\vmpk_cs.qm Delete /REBOOTOK $INSTDIR\vmpk_de.qm Delete /REBOOTOK $INSTDIR\vmpk_es.qm Delete /REBOOTOK $INSTDIR\vmpk_fr.qm Delete /REBOOTOK $INSTDIR\vmpk_nl.qm Delete /REBOOTOK $INSTDIR\vmpk_ru.qm Delete /REBOOTOK $INSTDIR\vmpk_sv.qm Delete /REBOOTOK $INSTDIR\vmpk_zh_CN.qm Delete /REBOOTOK $INSTDIR\vmpk.exe Delete /REBOOTOK $INSTDIR\spanish.xml Delete /REBOOTOK $INSTDIR\german.xml Delete /REBOOTOK $INSTDIR\azerty.xml Delete /REBOOTOK $INSTDIR\it-qwerty.xml Delete /REBOOTOK $INSTDIR\vkeybd-default.xml Delete /REBOOTOK $INSTDIR\pc102win.xml Delete /REBOOTOK $INSTDIR\gmgsxg.ins Delete /REBOOTOK $INSTDIR\help.html Delete /REBOOTOK $INSTDIR\help_de.html Delete /REBOOTOK $INSTDIR\help_es.html Delete /REBOOTOK $INSTDIR\help_nl.html Delete /REBOOTOK $INSTDIR\help_ru.html # Uninstalling library $INSTDIR\mingwm10.dll !insertmacro UnInstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\mingwm10.dll # Uninstalling library $INSTDIR\libgcc_s_dw2-1.dll !insertmacro UnInstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\libgcc_s_dw2-1.dll # Uninstalling library $INSTDIR\QtCore4.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\QtCore4.dll # Uninstalling library $INSTDIR\QtGui4.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\QtGui4.dll # Uninstalling library $INSTDIR\QtXml4.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\QtXml4.dll # Uninstalling library $INSTDIR\QtSvg4.dll !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\QtSvg4.dll DeleteRegValue HKLM "${REGKEY}\Components" Main SectionEnd Section -un.post UNSEC0001 DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall VMPK.lnk" Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\VMPK.lnk" Delete /REBOOTOK $INSTDIR\uninstall.exe DeleteRegValue HKLM "${REGKEY}" StartMenuGroup DeleteRegValue HKLM "${REGKEY}" Path DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components" DeleteRegKey /IfEmpty HKLM "${REGKEY}" RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup RmDir /REBOOTOK $INSTDIR SectionEnd # Uninstaller functions Function un.onInit ReadRegStr $INSTDIR HKLM "${REGKEY}" Path !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup !insertmacro SELECT_UNSECTION Main ${UNSEC0000} FunctionEnd vmpk-0.4.0/src/0000755000175000001440000000000011572642326012317 5ustar pedrousersvmpk-0.4.0/src/extracontrols.h0000644000175000001440000000736411572642326015411 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef EXTRACONTROLS_H #define EXTRACONTROLS_H #include #include namespace Ui { class DialogExtraControls; } const QListWidgetItem::ItemType extraControlType = QListWidgetItem::ItemType(QListWidgetItem::UserType + 1); class ExtraControl : public QListWidgetItem { public: ExtraControl( QListWidget *parent = 0, int type = extraControlType ): QListWidgetItem( parent, type ), m_type(0), m_minValue(0), m_maxValue(127), m_defValue(0), m_size(100) {} virtual ~ExtraControl() {} void setControl(int ctl) { m_control = ctl; } void setType(int type) { m_type = type; } void setMinimum(int v) { m_minValue = v; } void setMaximum(int v) { m_maxValue = v; } void setDefault(int v) { m_defValue = v; } void setSize(int s) { m_size = s; } void setOnValue(int v) { m_maxValue = v; } void setOffValue(int v) { m_minValue = v; } void setOnDefault(bool b) { m_defValue = int(b); } void setFileName(QString s) { m_fileName = s; } int getControl() { return m_control; } int getType() { return m_type; } int getMinimum() { return m_minValue; } int getMaximum() { return m_maxValue; } int getDefault() { return m_defValue; } int getSize() { return m_size; } int getOnValue() { return m_maxValue; } int getOffValue() { return m_minValue; } bool getOnDefault() { return bool(m_defValue); } QString getFileName() { return m_fileName; } QString toString(); void initFromString(const QString s); static int mbrFromString( const QString s, int def ); static void decodeString( const QString s, QString& label, int& control, int& type, int& minValue, int& maxValue, int& defValue, int& size, QString& fileName); private: int m_control; int m_type; int m_minValue; int m_maxValue; int m_defValue; int m_size; QString m_fileName; }; class DialogExtraControls : public QDialog { Q_OBJECT public: DialogExtraControls(QWidget *parent = 0); ~DialogExtraControls(); void setControls(const QStringList& ctls); QStringList getControls(); void retranslateUi(); public slots: void addControl(); void removeControl(); void controlUp(); void controlDown(); void itemSelected(QListWidgetItem *current, QListWidgetItem *previous); void labelEdited(QString newlabel); void controlChanged(int control); void typeChanged(int type); void minimumChanged(int minimum); void maximumChanged(int maximum); void onvalueChanged(int onvalue); void offvalueChanged(int offvalue); void defaultChanged(int defvalue); void defOnChanged(bool defOn); void sizeChanged(int size); void openFile(); protected: void changeEvent(QEvent *e); private: Ui::DialogExtraControls *m_ui; }; #endif // EXTRACONTROLS_H vmpk-0.4.0/src/keylabel.h0000644000175000001440000000204611572642326014262 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef KEYLABEL_H #define KEYLABEL_H #include "pianodefs.h" #include class VPIANO_EXPORT KeyLabel : public QGraphicsTextItem { public: KeyLabel(QGraphicsItem *parent = 0); virtual ~KeyLabel() {} virtual QRectF boundingRect() const; }; #endif // KEYLABEL_H vmpk-0.4.0/src/kmapdialog.cpp0000644000175000001440000000747111572642326015144 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "kmapdialog.h" #include "vpiano.h" #include #include #include #include #include KMapDialog::KMapDialog(QWidget *parent) : QDialog(parent) { ui.setupUi(this); m_btnOpen = ui.buttonBox->addButton(tr("Open..."), QDialogButtonBox::ActionRole); m_btnSave = ui.buttonBox->addButton(tr("Save As..."), QDialogButtonBox::ActionRole); m_btnOpen->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_DialogOpenButton))); m_btnSave->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_DialogSaveButton))); connect(m_btnOpen, SIGNAL(clicked()), SLOT(slotOpen())); connect(m_btnSave, SIGNAL(clicked()), SLOT(slotSave())); } void KMapDialog::displayMap(const KeyboardMap* map) { int row; if (map != NULL) m_map.copyFrom(map); setWindowTitle(m_map.getRawMode() ? tr("Raw Key Map Editor") : tr("Key Map Editor")); ui.tableWidget->clearContents(); ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(m_map.getRawMode() ? tr("Key Code") : tr("Key"))); QFileInfo f(m_map.getFileName()); ui.labelMapName->setText(f.fileName()); KeyboardMap::ConstIterator it; for(it = m_map.constBegin(); it != m_map.constEnd(); ++it) { row = it.value(); if (m_map.getRawMode()) { ui.tableWidget->setItem(row, 0, new QTableWidgetItem(QString::number(it.key()))); } else { QKeySequence ks(it.key()); ui.tableWidget->setItem(row, 0, new QTableWidgetItem(ks.toString())); } } } void KMapDialog::updateMap() { bool ok; m_map.clear(); QTableWidgetItem* item; for( int i=0; i<128; ++i) { item = ui.tableWidget->item(i, 0); if ((item != NULL) && !item->text().isEmpty()) { if (m_map.getRawMode()) { int keycode = item->text().toInt(&ok); if (ok) m_map.insert(keycode, i); } else { QKeySequence ks(item->text()); m_map.insert(ks[0], i); } } } } void KMapDialog::getMap(KeyboardMap* map) { updateMap(); map->copyFrom(&m_map); } void KMapDialog::slotOpen() { QString fileName = QFileDialog::getOpenFileName(0, tr("Open keyboard map definition"), VPiano::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { m_map.clear(); m_map.loadFromXMLFile(fileName); displayMap(NULL); } } void KMapDialog::slotSave() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save keyboard map definition"), VPiano::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { updateMap(); m_map.saveToXMLFile(fileName); } } void KMapDialog::retranslateUi() { ui.retranslateUi(this); m_btnOpen->setText(tr("Open...")); m_btnSave->setText(tr("Save As...")); } vmpk-0.4.0/src/pianokey.cpp0000644000175000001440000000512511572642326014645 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "pianokey.h" #include #include #include #include static const QBrush blackBrush = QBrush(Qt::black); static const QBrush whiteBrush = QBrush(Qt::white); PianoKey::PianoKey(const QRectF &rect, const QBrush &brush, const int note) : QGraphicsRectItem(rect), m_pressed(false), m_brush(brush), m_note(note), m_black(brush == blackBrush) { setAcceptedMouseButtons(Qt::NoButton); } PianoKey::PianoKey(const QRectF &rect, const bool black, const int note) : QGraphicsRectItem(rect), m_pressed(false), m_brush( black ? blackBrush : whiteBrush ), m_note(note), m_black(black) { setAcceptedMouseButtons(Qt::NoButton); } void PianoKey::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { static QSvgRenderer keyRenderer(QString(":/vpiano/blkey.svg")); static const QPen blackPen(Qt::black, 1); static const QPen grayPen(QBrush(Qt::gray), 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); if (m_pressed) { if (m_selectedBrush.style() != Qt::NoBrush) { painter->setBrush(m_selectedBrush); } else { painter->setBrush(QApplication::palette().highlight()); } } else { painter->setBrush(m_brush); } painter->setPen(blackPen); painter->drawRoundRect(rect(), 15, 15); if (m_black) keyRenderer.render(painter, rect()); else { QPointF points[3] = { QPointF(rect().left()+1.5, rect().bottom()-1), QPointF(rect().right()-1, rect().bottom()-1), QPointF(rect().right()-1, rect().top()+1), }; painter->setPen(grayPen); painter->drawPolyline(points, 3); } } void PianoKey::setPressed(bool p) { if (p != m_pressed) { m_pressed = p; update(); } } vmpk-0.4.0/src/preferences.h0000644000175000001440000000630611572642326014776 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef PREFERENCES_H #define PREFERENCES_H #include "ui_preferences.h" #include "instrument.h" #include "keyboardmap.h" #include class Preferences : public QDialog { Q_OBJECT public: Preferences(QWidget *parent = 0); int getNumOctaves() const { return m_numOctaves; } int getDrumsChannel() const { return m_drumsChannel; } int getNetworkPort() const { return m_networkPort; } QColor getKeyPressedColor() const { return m_keyPressedColor; } bool getGrabKeyboard() const { return m_grabKb; } bool getStyledWidgets() const { return m_styledKnobs; } bool getAlwaysOnTop() const { return m_alwaysOnTop; } bool getRawKeyboard() const { return m_rawKeyboard; } bool getVelocityColor() const { return m_velocityColor; } void setInstrumentsFileName( const QString fileName ); QString getInstrumentsFileName(); void setInstrumentName( const QString name ); QString getInstrumentName(); void apply(); Instrument* getInstrument(); Instrument* getDrumsInstrument(); void setRawKeyMapFileName( const QString fileName ); void setKeyMapFileName( const QString fileName ); KeyboardMap* getKeyboardMap() { return &m_keymap; } KeyboardMap* getRawKeyboardMap() { return &m_rawmap; } void retranslateUi(); public slots: void setNumOctaves(int value) { m_numOctaves = value; } void setDrumsChannel(int value) { m_drumsChannel = value; } void setNetworkPort(int value) { m_networkPort = value; } void setGrabKeyboard(bool value) { m_grabKb = value; } void setStyledWidgets(bool value) { m_styledKnobs = value; } void setAlwaysOnTop(bool value) { m_alwaysOnTop = value; } void setRawKeyboard(bool value) { m_rawKeyboard = value; } void setVelocityColor(bool value) { m_velocityColor = value; } void setKeyPressedColor(QColor value); void slotOpenInstrumentFile(); void slotSelectColor(); void slotOpenKeymapFile(); void slotOpenRawKeymapFile(); void slotRestoreDefaults(); void accept(); protected: void showEvent ( QShowEvent *event ); void restoreDefaults(); private: Ui::PreferencesClass ui; QString m_insFileName; InstrumentList m_ins; int m_numOctaves; int m_drumsChannel; int m_networkPort; bool m_grabKb; bool m_styledKnobs; bool m_alwaysOnTop; bool m_rawKeyboard; bool m_velocityColor; QColor m_keyPressedColor; KeyboardMap m_keymap; KeyboardMap m_rawmap; }; #endif // PREFERENCES_H vmpk-0.4.0/src/pianokey.h0000644000175000001440000000310311572642326014304 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef PIANOKEY_H_ #define PIANOKEY_H_ #include "pianodefs.h" #include #include class VPIANO_EXPORT PianoKey : public QGraphicsRectItem { public: PianoKey(QGraphicsItem * parent = 0 ) : QGraphicsRectItem(parent), m_pressed(false) { } PianoKey(const QRectF &rect, const QBrush &brush, const int note); PianoKey(const QRectF &rect, const bool black, const int note); void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); int getNote() const { return m_note; } void setPressedBrush(const QBrush& b) { m_selectedBrush = b; } bool isPressed() const { return m_pressed; } void setPressed(bool p); private: bool m_pressed; QBrush m_selectedBrush; QBrush m_brush; int m_note; bool m_black; }; #endif /*PIANOKEY_H_*/ vmpk-0.4.0/src/about.ui0000644000175000001440000002576011572642326014002 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ AboutClass 0 0 518 560 About :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 0 QLayout::SetMinimumSize 3 0 QLayout::SetMinimumSize 0 0 160 160 160 160 :/vpiano/vmpk_128x128.png Qt::AlignCenter false 10 Qt::NoTextInteraction 0 0 280 170 Qt::RichText true 10 true 500 0 true 0 0 510 357 3 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:16pt; font-weight:600;">Virtual MIDI Piano Keyboard</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://vmpk.sourceforge.net"><span style=" text-decoration: underline; color:#0057ae;">http://vmpk.sourceforge.net</span></a></p></body></html> true 0 0 0 277 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Copyright © 2008-2011, </span><a href="mailto:plcl@users.sf.net?subject=VMPK"><span style=" font-family:'Sans Serif'; font-size:9pt; text-decoration: underline; color:#0057ae;">Pedro Lopez-Cabanillas &lt;plcl@users.sf.net&gt;</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see </span><a href="http://www.gnu.org/licenses/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">http://www.gnu.org/licenses/</span></a><span style=" font-family:'Sans Serif';">.</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">The following copyright notice is also applicable:</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">This program contains </span><a href="http://www.music.mcgill.ca/~gary/rtmidi/"><span style=" font-family:'Sans Serif'; text-decoration: underline; color:#0057ae;">RtMIDI</span></a><span style=" font-family:'Sans Serif';">: realtime MIDI i/o C++ classes<br />Copyright © 2003-2010 Gary P. Scavone</span></p></body></html> Qt::RichText true true QDialogButtonBox::Close buttonBox rejected() AboutClass close() 306 315 325 335 vmpk-0.4.0/src/keyboardmap.h0000644000175000001440000000321511572642326014767 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef KEYBOARDMAP_H #define KEYBOARDMAP_H #include "constants.h" #include #include class KeyboardMap : public QHash { Q_DECLARE_TR_FUNCTIONS(KeyboardMap) public: KeyboardMap() : QHash(), m_fileName(QSTR_DEFAULT), m_rawMode(false) {} void loadFromXMLFile(const QString fileName); void saveToXMLFile(const QString fileName); void initializeFromXML(QIODevice *dev); void serializeToXML(QIODevice *dev); void copyFrom(const KeyboardMap* other); void setFileName(const QString fileName) { m_fileName = fileName; } const QString& getFileName() const { return m_fileName; } void setRawMode(bool b) { m_rawMode = b; } bool getRawMode() const { return m_rawMode; } private: void reportError( const QString filename, const QString title, const QString err ); QString m_fileName; bool m_rawMode; }; #endif /* KEYBOARDMAP_H */ vmpk-0.4.0/src/rawkeybdapp.h0000644000175000001440000000343211572642326015003 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef RAWKEYBDAPP_H #define RAWKEYBDAPP_H #include "pianodefs.h" #include class RawKbdHandler { public: virtual ~RawKbdHandler() {} virtual bool handleKeyPressed(int keycode) = 0; virtual bool handleKeyReleased(int keycode) = 0; }; class VPIANO_EXPORT RawKeybdApp : public QApplication { public: RawKeybdApp( int & argc, char ** argv ) : QApplication(argc, argv), m_enabled(false), m_handler(NULL) {} virtual ~RawKeybdApp() {} RawKbdHandler *getRawKbdHandler() { return m_handler; } void setRawKbdHandler(RawKbdHandler* h) { m_handler = h; } bool getRawKbdEnable() { return m_enabled; } void setRawKbdEnable(bool b) { m_enabled = b; } #if defined(Q_WS_X11) bool x11EventFilter ( XEvent * event ); #endif #if defined(Q_WS_MAC) bool macEventFilter ( EventHandlerCallRef caller, EventRef event ); #endif #if defined(Q_WS_WIN) bool winEventFilter ( MSG * msg, long * result ); #endif private: bool m_enabled; RawKbdHandler *m_handler; }; #endif // RAWKEYBDAPP_H vmpk-0.4.0/src/shortcutdialog.h0000644000175000001440000000610311572642326015523 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef SHORTCUTDIALOG_H #define SHORTCUTDIALOG_H #include "ui_shortcutdialog.h" #include #include #include class QAction; class QToolButton; class ShortcutTableItemEdit; //------------------------------------------------------------------------- // ShortcutTableItemEditor class ShortcutTableItemEditor : public QWidget { Q_OBJECT public: // Constructor. ShortcutTableItemEditor(QWidget *pParent = NULL); // Shortcut text accessors. void setText(const QString& sText); QString text() const; // Default (initial) shortcut text accessors. void setDefaultText(const QString& sDefaultText) { m_sDefaultText = sDefaultText; } const QString& defaultText() const { return m_sDefaultText; } signals: void editingFinished(); protected slots: void clear(); void finish(); private: // Instance variables. ShortcutTableItemEdit *m_pLineEdit; QToolButton *m_pToolButton; QString m_sDefaultText; }; //------------------------------------------------------------------------- // ShortcutTableItemDelegate class ShortcutTableItemDelegate : public QItemDelegate { Q_OBJECT public: // Constructor. ShortcutTableItemDelegate(QTableWidget *pTableWidget); protected: void paint(QPainter *pPainter, const QStyleOptionViewItem& option, const QModelIndex& index) const; QWidget *createEditor(QWidget *pParent, const QStyleOptionViewItem& option, const QModelIndex & index) const; void setEditorData(QWidget *pEditor, const QModelIndex &index) const; void setModelData(QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index) const; protected slots: void commitEditor(); private: QTableWidget *m_pTableWidget; }; //------------------------------------------------------------------------- // ShortcutDialog class ShortcutDialog : public QDialog { Q_OBJECT public: // Constructor. ShortcutDialog(QList actions, QWidget *pParent = NULL); void retranslateUi(); protected slots: void actionActivated(QTableWidgetItem *); void actionChanged(QTableWidgetItem *); void accept(); void reject(); private: // The Qt-designer UI struct... Ui::ShortcutDialog m_ui; QList m_actions; int m_iDirtyCount; }; #endif // SHORTCUTDIALOG_H // end of ShortcutDialog.h vmpk-0.4.0/src/net.sourceforge.vmpk.xml0000644000175000001440000001302111572642326017122 0ustar pedrousers vmpk-0.4.0/src/pianokeybd.h0000644000175000001440000001141111572642326014613 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef PIANOKEYBD_H #define PIANOKEYBD_H #include "pianoscene.h" #if defined(RAWKBD_SUPPORT) #include "rawkeybdapp.h" #endif #include #if defined(VPIANO_PLUGIN) #include #else #define QDESIGNER_WIDGET_EXPORT #endif class QDESIGNER_WIDGET_EXPORT PianoKeybd : public QGraphicsView #if defined(RAWKBD_SUPPORT) , public RawKbdHandler #endif { Q_OBJECT Q_PROPERTY( int baseOctave READ baseOctave WRITE setBaseOctave ) Q_PROPERTY( int numOctaves READ numOctaves WRITE setNumOctaves ) Q_PROPERTY( int rotation READ getRotation WRITE setRotation ) Q_PROPERTY( QColor keyPressedColor READ getKeyPressedColor WRITE setKeyPressedColor ) Q_PROPERTY( bool showLabels READ showLabels WRITE setShowLabels ) Q_PROPERTY( bool useFlats READ useFlats WRITE setUseFlats ) Q_PROPERTY( int transpose READ getTranspose WRITE setTranspose ) #if defined(VPIANO_PLUGIN) Q_CLASSINFO("Author", "Pedro Lopez-Cabanillas ") Q_CLASSINFO("URL", "http://sourceforge.net/projects/vmpk") Q_CLASSINFO("Version", "0.10") #endif public: PianoKeybd(QWidget *parent = 0); PianoKeybd(const int baseOctave, const int numOctaves, QWidget *parent = 0); virtual ~PianoKeybd(); void setKeyboardMap(KeyboardMap* m) { m_scene->setKeyboardMap(m); } void resetKeyboardMap() { m_scene->setKeyboardMap(&m_defaultMap); } KeyboardMap* getKeyboardMap() { return m_scene->getKeyboardMap(); } void setRawKeyboardMap(KeyboardMap* m) { m_rawMap = m; } KeyboardMap* getRawKeyboardMap() { return m_rawMap; } void resetRawKeyboardMap() { m_rawMap = &m_defaultRawMap; } int baseOctave() const { return m_scene->baseOctave(); } int numOctaves() const { return m_scene->numOctaves(); } void setBaseOctave(const int baseOctave) { m_scene->setBaseOctave(baseOctave); } void setNumOctaves(const int numOctaves); QSize sizeHint() const; int getRotation() const { return m_rotation; } void setRotation(int r); QColor getKeyPressedColor() const { return m_scene->getKeyPressedColor(); } void setKeyPressedColor(const QColor& c) { m_scene->setKeyPressedColor(c); } void allKeysOff() { m_scene->allKeysOff(); } void setPianoHandler(PianoHandler* handler) { m_scene->setPianoHandler(handler); } int minNote() const { return m_scene->getMinNote(); } void setMinNote(int n) { m_scene->setMinNote(n); } int maxNote() const { return m_scene->getMaxNote(); } void setMaxNote(int n) { m_scene->setMaxNote(n); } int getTranspose() const { return m_scene->getTranspose(); } void setTranspose(int t) { m_scene->setTranspose(t); } bool showLabels() const { return m_scene->showLabels(); } void setShowLabels(bool show) { m_scene->setShowLabels(show); } bool useFlats() const { return m_scene->useFlats(); } void setUseFlats(bool use) { m_scene->setUseFlats(use); } bool getRawKeyboardMode() const { return m_scene->getRawKeyboardMode(); } void setRawKeyboardMode(const bool b) { m_scene->setRawKeyboardMode(b); } void useCustomNoteNames(const QStringList& names) { m_scene->useCustomNoteNames(names); } void useStandardNoteNames() { m_scene->useStandardNoteNames(); } int getVelocity() { return m_scene->getVelocity(); } void setVelocity(const int velocity) { m_scene->setVelocity(velocity); } void retranslate(); #if defined(RAWKBD_SUPPORT) // RawKbdHandler methods bool handleKeyPressed(int keycode); bool handleKeyReleased(int keycode); #endif public slots: void showNoteOn( int midiNote, int vel = -1 ); void showNoteOff( int midiNote, int vel = -1 ); signals: void noteOn( int midiNote, int vel ); void noteOff( int midiNote, int vel ); protected: void initialize(); void initDefaultMap(); void initScene(int base, int num, const QColor& c = QColor()); void resizeEvent(QResizeEvent *event); private: int m_rotation; PianoScene *m_scene; KeyboardMap *m_rawMap; KeyboardMap m_defaultMap; KeyboardMap m_defaultRawMap; }; #endif // PIANOKEYBD_H vmpk-0.4.0/src/main.cpp0000644000175000001440000000363111572642326013752 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "constants.h" #include "vpiano.h" #if defined(RAWKBD_SUPPORT) #include "rawkeybdapp.h" #endif #include #if defined(Q_OS_SYMBIAN) // to lock orientation in Symbian #include #include #include #include #endif int main(int argc, char *argv[]) { QCoreApplication::setOrganizationName(QSTR_DOMAIN); QCoreApplication::setOrganizationDomain(QSTR_DOMAIN); QCoreApplication::setApplicationName(QSTR_APPNAME); #if defined(RAWKBD_SUPPORT) RawKeybdApp a(argc, argv); #else QApplication a(argc, argv); #endif #if defined(Q_OS_LINUX) a.setWindowIcon(QIcon(":/vpiano/vmpk_32x32.png")); #endif //Q_OS_LINUX #if defined(Q_OS_SYMBIAN) // Lock orientation to portrait in Symbian CAknAppUi* appUi = dynamic_cast (CEikonEnv::Static()->AppUi()); TRAP_IGNORE( if(appUi) { appUi->SetOrientationL(CAknAppUi::EAppUiOrientationLandscape); } ); #endif //Q_OS_SYMBIAN VPiano w; if (w.isInitialized()) { #if defined(SMALL_SCREEN) w.showMaximized(); #else w.show(); #endif return a.exec(); } return EXIT_FAILURE; } vmpk-0.4.0/src/about.h0000644000175000001440000000176211572642326013610 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef ABOUT_H #define ABOUT_H #include "ui_about.h" #include class About : public QDialog { Q_OBJECT public: About(QWidget *parent = 0); void retranslateUi(); private: Ui::AboutClass ui; }; #endif // ABOUT_H vmpk-0.4.0/src/kmapdialog.ui0000644000175000001440000004103211572642326014766 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ KMapDialogClass 0 0 255 382 Key Map Editor :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 10 75 true This box displays the name of the current mapping file QFrame::StyledPanel QFrame::Sunken 150 0 This is the list of the PC keyboard mappings. Each row has a number corresponding to the MIDI note number, and you can type an alphanumeric Key name that will be translated to the given note 128 0 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Key Qt::Vertical QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() KMapDialogClass accept() 247 220 203 206 buttonBox rejected() KMapDialogClass reject() 243 221 71 208 vmpk-0.4.0/src/knob.cpp0000644000175000001440000001110211572642326013747 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. See http://qsynth.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #define _USE_MATH_DEFINES // MSVC #include "knob.h" #include #include #include //------------------------------------------------------------------------- // Knob - Instance knob widget class. // // Constructor. Knob::Knob ( QWidget *pParent ) : QDial(pParent), m_iDefaultValue(-1), m_dialMode(AngularMode), m_bMousePressed(false), m_lastDragValue(0.0f) {} void Knob::setDefaultValue ( int iDefaultValue ) { m_iDefaultValue = iDefaultValue; } void Knob::setDialMode ( Knob::DialMode dialMode ) { m_dialMode = dialMode; } // Mouse angle determination. float Knob::mouseAngle ( const QPoint& pos ) { float dx = pos.x() - (width() / 2); float dy = (height() / 2) - pos.y(); return 180.0f * atan2f(dx, dy) / float(M_PI); } // Alternate mouse behavior event handlers. void Knob::mousePressEvent ( QMouseEvent *pMouseEvent ) { if (m_dialMode == QDialMode) { QDial::mousePressEvent(pMouseEvent); } else if (pMouseEvent->button() == Qt::LeftButton) { m_bMousePressed = true; m_posMouse = pMouseEvent->pos(); m_lastDragValue = float(sliderPosition()); emit sliderPressed(); } else if (pMouseEvent->button() == Qt::MidButton) { // Reset to default value... if (m_iDefaultValue < minimum() || m_iDefaultValue > maximum()) m_iDefaultValue = (maximum() + minimum()) / 2; updatePosition(m_iDefaultValue); } } void Knob::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { if (m_dialMode == QDialMode) { QDial::mouseMoveEvent(pMouseEvent); return; } if (!m_bMousePressed) return; const QPoint& posMouse = pMouseEvent->pos(); int xdelta = posMouse.x() - m_posMouse.x(); int ydelta = posMouse.y() - m_posMouse.y(); float angleDelta = mouseAngle(posMouse) - mouseAngle(m_posMouse); int iNewValue = sliderPosition(); switch (m_dialMode) { case LinearMode: iNewValue = int(m_lastDragValue + xdelta - ydelta); if (iNewValue > maximum()) iNewValue = maximum(); else if (iNewValue < minimum()) iNewValue = minimum(); break; case AngularMode: default: // Forget about the drag origin to be robust on full rotations if (angleDelta > +180.0f) angleDelta = angleDelta - 360.0f; if (angleDelta < -180.0f) angleDelta = angleDelta + 360.0f; m_lastDragValue += float(maximum() - minimum()) * angleDelta / 270.0f; if (m_lastDragValue > float(maximum())) m_lastDragValue = float(maximum()); if (m_lastDragValue < float(minimum())) m_lastDragValue = float(minimum()); m_posMouse = posMouse; iNewValue = int(m_lastDragValue + 0.5f); break; } updatePosition(iNewValue); } void Knob::mouseReleaseEvent ( QMouseEvent *pMouseEvent ) { if (m_dialMode == QDialMode) { QDial::mouseReleaseEvent(pMouseEvent); } else if (m_bMousePressed) { m_bMousePressed = false; } } void Knob::wheelEvent ( QWheelEvent *pWheelEvent ) { if (m_dialMode == QDialMode) { QDial::wheelEvent(pWheelEvent); } else { int iValue = sliderPosition(); if (pWheelEvent->delta() > 0) iValue -= pageStep(); else iValue += pageStep(); if (iValue > maximum()) iValue = maximum(); else if (iValue < minimum()) iValue = minimum(); updatePosition(iValue); } } void Knob::updatePosition(int val) { setSliderPosition(val); setToolTip(QString::number(val)); update(); emit sliderMoved(val); } // end of knob.cpp vmpk-0.4.0/src/extracontrols.cpp0000644000175000001440000002576511572642326015751 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "extracontrols.h" #include "qticonloader.h" #include "ui_extracontrols.h" #include #include DialogExtraControls::DialogExtraControls(QWidget *parent) : QDialog(parent), m_ui(new Ui::DialogExtraControls) { m_ui->setupUi(this); m_ui->btnUp->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_ArrowUp))); m_ui->btnDown->setIcon(style()->standardIcon(QStyle::StandardPixmap(QStyle::SP_ArrowDown))); m_ui->btnAdd->setIcon(QtIconLoader::icon("list-add", QIcon(":/vpiano/list-add.svg"))); m_ui->btnRemove->setIcon(QtIconLoader::icon("list-remove", QIcon(":/vpiano/list-remove.svg"))); connect( m_ui->btnAdd, SIGNAL(clicked()), SLOT(addControl()) ); connect( m_ui->btnRemove, SIGNAL(clicked()), SLOT(removeControl()) ); connect( m_ui->btnUp, SIGNAL(clicked()), SLOT(controlUp()) ); connect( m_ui->btnDown, SIGNAL(clicked()), SLOT(controlDown()) ); connect( m_ui->extraList, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), SLOT(itemSelected(QListWidgetItem *, QListWidgetItem*)) ); connect( m_ui->txtLabel, SIGNAL(textEdited(QString)), SLOT(labelEdited(QString)) ); connect( m_ui->spinController, SIGNAL(valueChanged(int)), SLOT(controlChanged(int)) ); connect( m_ui->cboControlType, SIGNAL(currentIndexChanged(int)), SLOT(typeChanged(int)) ); connect( m_ui->chkSwitchDefOn, SIGNAL(toggled(bool)), SLOT(defOnChanged(bool)) ); connect( m_ui->spinKnobDef, SIGNAL(valueChanged(int)), SLOT(defaultChanged(int)) ); connect( m_ui->spinSpinDef, SIGNAL(valueChanged(int)), SLOT(defaultChanged(int)) ); connect( m_ui->spinSliderDef, SIGNAL(valueChanged(int)), SLOT(defaultChanged(int)) ); connect( m_ui->spinKnobMax, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinSpinMax, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinSliderMax, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinKnobMin, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinSpinMin, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinSliderMin, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinValueOff, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->spinValueOn, SIGNAL(valueChanged(int)), SLOT(maximumChanged(int)) ); connect( m_ui->spinSliderSize, SIGNAL(valueChanged(int)), SLOT(sizeChanged(int)) ); connect( m_ui->spinValue, SIGNAL(valueChanged(int)), SLOT(minimumChanged(int)) ); connect( m_ui->btnFileSyx, SIGNAL(clicked()), SLOT(openFile()) ); #if defined(SMALL_SCREEN) setWindowState(Qt::WindowActive | Qt::WindowMaximized); #endif } DialogExtraControls::~DialogExtraControls() { delete m_ui; } void DialogExtraControls::addControl() { ExtraControl *e = new ExtraControl(m_ui->extraList); e->setText(tr("New Control")); m_ui->extraList->setCurrentItem(e); } void DialogExtraControls::removeControl() { int row = m_ui->extraList->currentRow(); QListWidgetItem *e = m_ui->extraList->takeItem(row); delete e; } void DialogExtraControls::controlUp() { int row = m_ui->extraList->currentRow(); QListWidgetItem *e = m_ui->extraList->takeItem(row); if (e != NULL) { m_ui->extraList->insertItem(row - 1, e); m_ui->extraList->setCurrentItem(e); } } void DialogExtraControls::controlDown() { int row = m_ui->extraList->currentRow(); QListWidgetItem *e = m_ui->extraList->takeItem(row); if (e != NULL) { m_ui->extraList->insertItem(row + 1, e); m_ui->extraList->setCurrentItem(e); } } void DialogExtraControls::itemSelected( QListWidgetItem *current, QListWidgetItem * ) { ExtraControl *e = dynamic_cast(current); m_ui->commonFrame->setEnabled( e != NULL ); m_ui->cboControlType->setEnabled( e != NULL ); m_ui->stackedPanel->setEnabled( e != NULL ); m_ui->btnRemove->setEnabled(e != NULL ); m_ui->btnUp->setEnabled(e != NULL && m_ui->extraList->currentRow() > 0); m_ui->btnDown->setEnabled(e != NULL && m_ui->extraList->currentRow() < (m_ui->extraList->count()-1)); if (e != NULL) { m_ui->txtLabel->setText(e->text()); m_ui->spinController->setValue(e->getControl()); m_ui->cboControlType->setCurrentIndex(e->getType()); m_ui->spinKnobDef->setValue(e->getDefault()); m_ui->spinSpinDef->setValue(e->getDefault()); m_ui->spinSliderDef->setValue(e->getDefault()); m_ui->spinKnobMin->setValue(e->getMinimum()); m_ui->spinSpinMin->setValue(e->getMinimum()); m_ui->spinSliderMin->setValue(e->getMinimum()); m_ui->spinKnobMax->setValue(e->getMaximum()); m_ui->spinSpinMax->setValue(e->getMaximum()); m_ui->spinSliderMax->setValue(e->getMaximum()); m_ui->spinValueOff->setValue(e->getOffValue()); m_ui->spinValueOn->setValue(e->getOnValue()); m_ui->chkSwitchDefOn->setChecked(e->getOnDefault()); m_ui->spinSliderSize->setValue(e->getSize()); m_ui->spinValue->setValue(e->getMinimum()); m_ui->edtFileSyx->setText(e->getFileName()); } } void DialogExtraControls::labelEdited(QString newLabel) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setText(newLabel); } void DialogExtraControls::controlChanged(int control) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setControl(control); } void DialogExtraControls::typeChanged(int type) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) { e->setType(type); if (type == 5) { e->setControl(255); m_ui->spinController->setEnabled(false); } else m_ui->spinController->setEnabled(true); } } void DialogExtraControls::minimumChanged(int minimum) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setMinimum(minimum); } void DialogExtraControls::maximumChanged(int maximum) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setMaximum(maximum); } void DialogExtraControls::onvalueChanged(int onvalue) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setOnValue(onvalue); } void DialogExtraControls::offvalueChanged(int offvalue) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setOffValue(offvalue); } void DialogExtraControls::defaultChanged(int defvalue) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setDefault(defvalue); } void DialogExtraControls::defOnChanged(bool defOn) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setOnDefault(defOn); } void DialogExtraControls::sizeChanged(int size) { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) e->setSize(size); } void DialogExtraControls::setControls(const QStringList& ctls) { m_ui->extraList->clear(); foreach(const QString& s, ctls) { ExtraControl *item = new ExtraControl(m_ui->extraList); item->initFromString(s); } } QStringList DialogExtraControls::getControls() { QStringList lst; for(int row = 0; row < m_ui->extraList->count(); ++row) { ExtraControl *item = static_cast(m_ui->extraList->item(row)); lst << item->toString(); } return lst; } void DialogExtraControls::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: m_ui->retranslateUi(this); break; default: break; } } void DialogExtraControls::openFile() { ExtraControl *e = dynamic_cast(m_ui->extraList->currentItem()); if (e != NULL) { QString fileName = QFileDialog::getOpenFileName(this, tr("System Exclusive File"), QString::null, tr("System Exclusive (*.syx)")); if (!fileName.isEmpty()) { m_ui->edtFileSyx->setText(fileName); e->setFileName(fileName); } } } void DialogExtraControls::retranslateUi() { m_ui->retranslateUi(this); } QString ExtraControl::toString() { QStringList lst; lst << text(); lst << QString::number(m_control); lst << QString::number(m_type); lst << QString::number(m_minValue); lst << QString::number(m_maxValue); lst << QString::number(m_defValue); if (m_type == 3) lst << QString::number(m_size); if (m_type == 5) lst << m_fileName; return lst.join(","); } int ExtraControl::mbrFromString(const QString sTmp, int def) { bool ok; int iTmp = sTmp.toInt(&ok); if (ok) return iTmp; return def; } void ExtraControl::decodeString( const QString s, QString& label, int& control, int& type, int& minValue, int& maxValue, int& defValue, int& size, QString& fileName) { QStringList lst = s.split(","); if (!lst.isEmpty()) label = lst.takeFirst(); if (!lst.isEmpty()) control = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty()) type = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty()) minValue = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty()) maxValue = ExtraControl::mbrFromString(lst.takeFirst(), 127); if (!lst.isEmpty()) defValue = ExtraControl::mbrFromString(lst.takeFirst(), 0); if (!lst.isEmpty() && type == 3) size = ExtraControl::mbrFromString(lst.takeFirst(), 100); if (!lst.isEmpty() && type == 5) fileName = lst.takeFirst(); } void ExtraControl::initFromString(const QString s) { QString lbl; ExtraControl::decodeString( s, lbl, m_control, m_type, m_minValue, m_maxValue, m_defValue, m_size, m_fileName ); setText(lbl); } vmpk-0.4.0/src/keylabel.cpp0000644000175000001440000000212511572642326014613 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "keylabel.h" #include "pianokey.h" #include KeyLabel::KeyLabel(QGraphicsItem *parent) : QGraphicsTextItem(parent) { setAcceptedMouseButtons(Qt::NoButton); rotate(270); } QRectF KeyLabel::boundingRect() const { PianoKey* key = static_cast(parentItem()); return mapRectFromScene(key->rect()); } vmpk-0.4.0/src/CMakeLists.txt0000644000175000001440000001055111572642326015061 0ustar pedrousers# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2011 Pedro Lopez-Cabanillas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; If not, see . include_directories (${CMAKE_CURRENT_BINARY_DIR}) link_directories (${CMAKE_CURRENT_BINARY_DIR}) if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/vmpk_version.h) file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/vmpk_version.h "const QString PGM_VERSION(\"${VERSION}\");\n") endif (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/vmpk_version.h) set (vmpk_forms_SRCS about.ui extracontrols.ui kmapdialog.ui midisetup.ui preferences.ui riffimportdlg.ui vpiano.ui shortcutdialog.ui) QT4_WRAP_UI (vmpk_ui_SRCS ${vmpk_forms_SRCS}) set (vmpk_SRCS about.cpp about.h classicstyle.cpp classicstyle.h constants.h extracontrols.cpp extracontrols.h instrument.cpp instrument.h keyboardmap.cpp keyboardmap.h keylabel.cpp keylabel.h kmapdialog.cpp kmapdialog.h knob.cpp knob.h main.cpp mididefs.h midisetup.cpp midisetup.h pianodefs.h pianokeybd.cpp pianokeybd.h pianokey.cpp pianokey.h pianoscene.cpp pianoscene.h preferences.cpp preferences.h qticonloader.cpp qticonloader.h rawkeybdapp.cpp rawkeybdapp.h riff.cpp riff.h riffimportdlg.cpp riffimportdlg.h RtError.h RtMidi.cpp RtMidi.h udpmidi.cpp vpiano.cpp vpiano.h shortcutdialog.cpp shortcutdialog.h ) QT4_ADD_RESOURCES (vmpk_SRCS ../data/vmpk.qrc) set (vmpk_qtobject_SRCS about.h extracontrols.h kmapdialog.h knob.h midisetup.h pianokeybd.h pianoscene.h preferences.h riff.h riffimportdlg.h vpiano.h shortcutdialog.h) if (ENABLE_DBUS) QT4_ADD_DBUS_ADAPTOR (vmpk_SRCS net.sourceforge.vmpk.xml vpiano.h VPiano vmpk_adaptor) endif () QT4_WRAP_CPP (vmpk_moc_SRCS ${vmpk_qtobject_SRCS}) if (UNIX AND NOT APPLE) add_executable (vmpk ${vmpk_ui_SRCS} ${vmpk_moc_SRCS} ${vmpk_SRCS}) install (TARGETS vmpk RUNTIME DESTINATION bin) endif () if (WIN32) set (vmpk_RESOURCES) configure_file (vmpk.rc.in ${CMAKE_CURRENT_BINARY_DIR}/vmpk.rc IMMEDIATE @ONLY) if (MINGW) ADD_WINDRES_OBJS (vmpk_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/vmpk.rc) endif () if ( MSVC ) set (vmpk_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/vmpk.rc) endif () add_executable (vmpk WIN32 ${vmpk_ui_SRCS} ${vmpk_moc_SRCS} ${vmpk_SRCS} ${vmpk_RESOURCES}) install (TARGETS vmpk RUNTIME DESTINATION .) endif () if (APPLE) set (MACOSX_BUNDLE_INFO_STRING "Virtual MIDI Piano Keyboard" ) set (MACOSX_BUNDLE_BUNDLE_VERSION ${VERSION} ) set (MACOSX_BUNDLE_ICON_FILE "vmpk.icns" ) set (MACOSX_BUNDLE_GUI_IDENTIFIER "net.sourceforge" ) set (MACOSX_BUNDLE_BUNDLE_NAME "vmpk" ) set (vmpk_RSC ../data/vmpk.icns ../data/help.html ../data/help_de.html ../data/help_es.html ../data/help_nl.html ../data/help_ru.html ../data/help_tr.html ../data/txt2ins.awk ../data/gmgsxg.ins ../data/spanish.xml ../data/german.xml ../data/azerty.xml ../data/it-qwerty.xml ../data/vkeybd-default.xml ../data/pc102mac.xml ) set_source_files_properties (${vmpk_RSC} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) add_executable (vmpk MACOSX_BUNDLE ${vmpk_ui_SRCS} ${vmpk_moc_SRCS} ${vmpk_SRCS} ${vmpk_RSC}) endif () set_target_properties (vmpk PROPERTIES OUTPUT_NAME ${PROGRAM_NAME}) vmpk-0.4.0/src/RtError.h0000644000175000001440000000413011572642326014065 0ustar pedrousers/************************************************************************/ /*! \class RtError \brief Exception handling class for RtAudio & RtMidi. The RtError class is quite simple but it does allow errors to be "caught" by RtError::Type. See the RtAudio and RtMidi documentation to know which methods can throw an RtError. */ /************************************************************************/ #ifndef RTERROR_H #define RTERROR_H #include #include #include class RtError : public std::exception { public: //! Defined RtError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; //! The constructor. RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {} //! The destructor. virtual ~RtError( void ) throw() {} //! Prints thrown error message to stderr. virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) const throw() { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) const throw() { return message_; } //! Returns the thrown error message as a c-style string. virtual const char* what( void ) const throw() { return message_.c_str(); } protected: std::string message_; Type type_; }; #endif vmpk-0.4.0/src/vpiano.ico0000644000175000001440000000706611572642326014320 0ustar pedrousersh& ( DDDTTT\\\hhhrrr{{{!!!!!!!!!!!!!!!!$$$$$"$$$$$$$$$$$#$$$$$$$$$$$#$$$$$$$$$$$#$$$$$$$$$$$#$$$$$$$ $$ $ $$$ $$$ $$$ $$$ $$$ $$$ $$    ( @ &&&)))***111333BBBOOOSSS\\\^^^jjjkkkmmmnnnppptttuuuxxxyyyzzz{{{|||================================================================*****(+******)%*****$,******('**CCCCCCCCCCCC8CCCCC?CCCCCCBCCCCCCCCCCCCCCCCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCCCCCCCCCCC>CCCCCC"CCCCCCCCCCCC1  CC  9CCCC"CCC@  ACCC >6CCCC"CCC).CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC:2CCCC"CCC#CCC;4CCCBCCC!&777 75-777/ 77703vmpk-0.4.0/src/constants.h0000644000175000001440000001111611572642326014504 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef CONSTANTS_H_ #define CONSTANTS_H_ #include #include #include "vmpk_version.h" /* Don't translate any string defined in this header */ //replaced with the generated header "vmpk_version.h" //const QString PGM_VERSION("0.2.4cvs"); const QString BLD_DATE(__DATE__); const QString BLD_TIME(__TIME__); #if defined(Q_CC_GNU) || defined(Q_CC_GCCE) const QString CMP_VERSION(__VERSION__); #elif defined(Q_CC_MSVC) const QString CMP_VERSION(QString::number(_MSC_VER/100.0,'g',2)); #else const QString CMP_VERSION(QString()); #endif const QString QSTR_APPNAME("Virtual MIDI Piano Keyboard"); const QString QSTR_DOMAIN("vmpk.sourceforge.net"); const QString QSTR_VMPKPX("vmpk_"); const QString QSTR_QTPX("qt_"); const QString QSTR_WINDOW("Window"); const QString QSTR_GEOMETRY("Geometry"); const QString QSTR_STATE("State"); const QString QSTR_PREFERENCES("Preferences"); const QString QSTR_CHANNEL("Channel"); const QString QSTR_VELOCITY("Velocity"); const QString QSTR_BASEOCTAVE("BaseOctave"); const QString QSTR_TRANSPOSE("Transpose"); const QString QSTR_NUMOCTAVES("NumOctaves"); const QString QSTR_INSTRUMENTSDEFINITION("InstrumentsDefinition"); const QString QSTR_INSTRUMENTNAME("InstrumentName"); const QString QSTR_KEYPRESSEDCOLOR("KeyPressedColor"); const QString QSTR_CONNECTIONS("Connections"); const QString QSTR_INENABLED("InEnabled"); const QString QSTR_THRUENABLED("ThruEnabled"); const QString QSTR_INPORT("InPort"); const QString QSTR_OUTPORT("OutPort"); const QString QSTR_KEYBOARD("Keyboard"); const QString QSTR_MAPFILE("MapFile"); const QString QSTR_RAWMAPFILE("RawMapFile"); const QString QSTR_DEFAULT("default"); const QString QSTR_CONTROLLERS("Controllers"); const QString QSTR_INSTRUMENT("Instrument"); const QString QSTR_BANK("Bank"); const QString QSTR_PROGRAM("Program"); const QString QSTR_CONTROLLER("Controller"); const QString QSTR_GRABKB("GrabKeyboard"); const QString QSTR_STYLEDKNOBS("StyledKnobs"); const QString QSTR_ALWAYSONTOP("AlwaysOnTop"); const QString QSTR_SHOWNOTENAMES("ShowNoteNames"); const QString QSTR_SHOWSTATUSBAR("ShowStatusBar"); const QString QSTR_RAWKEYBOARDMODE("RawKeyboardMode"); const QString QSTR_EXTRACONTROLLERS("ExtraControllers"); const QString QSTR_EXTRACTLPREFIX("ExtraCtl_"); const QString QSTR_VMPK("VMPK"); const QString QSTR_VMPKINPUT("VMPK Input"); const QString QSTR_VMPKOUTPUT("VMPK Output"); const QString QSTR_DEFAULTINS("gmgsxg.ins"); const QString QSTR_DRUMSCHANNEL("DrumsChannel"); const QString QSTR_SHORTCUTS("Shortcuts"); const QString QSTR_LANGUAGE("Language"); const QString QSTR_VELOCITYCOLOR("VelocityColor"); const QString QSTR_NETWORKPORT("NetworkPort"); #if defined(SMALL_SCREEN) const QString QSTR_VMPKURL("http://vmpk.sourceforge.net/m/"); const QString QSTR_HELP("hm.html"); const QString QSTR_HELPL("hm_%1.html"); #else const QString QSTR_VMPKURL("http://vmpk.sourceforge.net"); const QString QSTR_HELP("help.html"); const QString QSTR_HELPL("help_%1.html"); #endif const char MIDICTLNUMBER[] = "MIDICTLNUMBER\0"; const char MIDICTLONVALUE[] = "MIDICTLONVAL\0"; const char MIDICTLOFFVALUE[] = "MIDICTLOFFVAL\0"; const char SYSEXFILENAME[] = "SYSEXFILENAME\0"; const char SYSEXFILEDATA[] = "SYSEXFILEDATA\0"; const int MIDIGMDRUMSCHANNEL = 9; const int MIDICHANNELS = 16; const int MIDIVELOCITY = 100; const int MIDIPAN = 64; const int MIDIVOLUME = 100; const int MIDIEXPRESSION = 127; #if defined(SMALL_SCREEN) const int DEFAULTNUMBEROFOCTAVES = 2; const int TOOLBARLABELMARGIN = 2; const int KEYLABELFONTSIZE = 3; #else const int DEFAULTNUMBEROFOCTAVES = 5; const int TOOLBARLABELMARGIN = 5; const int KEYLABELFONTSIZE = 7; #endif const int NETWORKPORTNUMBER = 21928; #if defined(NETWORK_MIDI) extern int g_iUdpPort; #endif #if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA) #error "This program requires Qt built with the Carbon framework. Sorry." #endif #endif /*CONSTANTS_H_*/ vmpk-0.4.0/src/vmpk.rc.in0000644000175000001440000000266511572642326014240 0ustar pedrousersIDI_ICON1 ICON DISCARDABLE "vmpk.ico" 1 VERSIONINFO FILEVERSION @VERSION_MAJOR@, @VERSION_MINOR@, @VERSION_PATCH@, 0 PRODUCTVERSION @VERSION_MAJOR@, @VERSION_MINOR@, @VERSION_PATCH@, 0 FILEOS 4 // VOS__WINDOWS32 FILETYPE 1 // VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "vmpk.sf.net" VALUE "FileDescription", "Virtual MIDI Piano Keyboard" VALUE "FileVersion", "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@" VALUE "Full Version", "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@@VERSION_SUFFIX@" VALUE "InternalName", "VMPK" VALUE "LegalCopyright", "Copyright \251 2008-2010 Pedro Lopez-Cabanillas. Licensed under the terms of the GPL v3 or later" VALUE "OriginalFilename", "vmpk.exe" VALUE "ProductName", "Virtual MIDI Piano Keyboard" VALUE "ProductVersion", "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0405, 1200, // Czech 0x0407, 1200, // German 0x0409, 1200, // U.S. English 0x040A, 1200, // Castilian Spanish 0x040C, 1200, // French 0x0413, 1200, // Dutch 0x0419, 1200, // Russian 0x0804, 1200 // Simplified Chinese END END vmpk-0.4.0/src/riff.cpp0000644000175000001440000002024011572642326013747 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include #include #include "riff.h" Riff::Riff(QObject* parent) : QObject(parent) {} Riff::~Riff() {} #if 0 static QString toString(quint32 ckid) { QByteArray data((char*) &ckid, 4); return QString(data); } #endif void Riff::readFromFile(QString fileName) { QFile file(m_fileName = fileName); file.open(QIODevice::ReadOnly); QDataStream ds(&file); readFromStream(&ds); file.close(); } void Riff::readFromStream(QDataStream* ds) { if (ds != NULL) { m_IOStream = ds; m_IOStream->setByteOrder(QDataStream::LittleEndian); read(); } } quint16 Riff::read16bit() { quint16 wrk; *m_IOStream >> wrk; return wrk; } quint32 Riff::read32bit() { quint32 wrk; *m_IOStream >> wrk; return wrk; } QString Riff::readstr(int size) { #if defined(Q_CC_GNU) || defined(Q_CC_GCCE) char buffer[size+1]; #elif defined(Q_CC_MSVC) char *buffer = (char *) alloca (size+1); #endif m_IOStream->readRawData(buffer, size); buffer[size] = 0; return QString(buffer).trimmed(); } void Riff::skip(int size) { if (size & 1) size++; m_IOStream->skipRawData(size); } quint32 Riff::readExpectedChunk(quint32 cktype) { quint32 chunkType, len = 0; chunkType = read32bit(); if (chunkType == cktype) { len = read32bit(); // qDebug() << "Expected chunkType:" << toString(chunkType) // << "(" << hex << chunkType << ")" // << "length:" << dec << len; } return len; } quint32 Riff::readChunk(quint32& chunkType) { quint32 len = 0; chunkType = read32bit(); len = read32bit(); // qDebug() << "chunkType:" << toString(chunkType) // << "(" << hex << chunkType << ")" // << "length:" << dec << len; return len; } quint32 Riff::readChunkID() { quint32 chunkID = read32bit(); // qDebug() << "chunkID:" << toString(chunkID) // << "(" << hex << chunkID << ")"; return chunkID; } QString Riff::readSFVersion() { int sfVersion = read16bit(); int sfMinor = read16bit(); return QString("%1.%2").arg(sfVersion).arg(sfMinor); } QString Riff::readDLSVersion() { quint16 v[4]; for(int i=0; i<4; ++i) v[i] = read16bit(); return QString("%1.%2.%3.%4").arg(v[0]).arg(v[1]).arg(v[2]).arg(v[3]); } void Riff::processINFO(int size) { QString str; quint32 chunkID = 0; quint32 length = 0; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); if (length & 1) length++; size -= 8; switch (chunkID) { case CKID_IFIL: m_version = readSFVersion(); break; case CKID_INAM: m_name = readstr(length); break; case CKID_ICOP: m_copyright = readstr(length); break; default: skip(length); } size -= length; } } void Riff::processPHDR(int size) { int i, pc, bank; char name[21]; int npresets = size / 38 - 1; for (i = 0; i < npresets; i++) { if (m_IOStream->atEnd()) return; m_IOStream->readRawData(name, 20); name[20] = 0; pc = read16bit(); bank = read16bit(); skip(14); if (bank < 128) emit signalInstrument(bank, pc, QString(name)); else emit signalPercussion(bank, pc, QString(name)); //qDebug() << "Instrument: " << bank << pc << name; } skip(38); } void Riff::processPDTA(int size) { quint32 chunkID = 0; quint32 length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; if (m_IOStream->atEnd()) return; if (chunkID == CKID_PHDR) processPHDR(length); else skip(length); size -= length; } } void Riff::processSFList(int size) { quint32 chunkID = 0; if (m_IOStream->atEnd()) return; chunkID = readChunkID(); size -= 4; switch (chunkID) { case CKID_INFO: processINFO(size); break; case CKID_PDTA: processPDTA(size); break; default: skip(size); } } void Riff::processINSH(quint32& bank, quint32& pc, bool& perc) { read32bit(); bank = read32bit(); pc = read32bit(); perc = (bank & 0x80000000) != 0; bank &= 0x3FFF; } void Riff::processINS(int size) { bool perc = false; quint32 bank = 0, pc = 0; quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; switch (chunkID) { case CKID_INSH: processINSH(bank, pc, perc); break; case CKID_LIST: processDLSList(length); break; default: skip(length); } size -= length; } //qDebug() << "Instrument:" << bank << pc << m_name; if (perc) emit signalPercussion(bank, pc, m_name); else emit signalInstrument(bank, pc, m_name); m_name.clear(); m_copyright.clear(); } void Riff::processLINS(int size) { quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; if (chunkID == CKID_LIST) processDLSList(length); else skip(length); size -= length; } } void Riff::processDLSList(int size) { quint32 chunkID = 0; if (m_IOStream->atEnd()) return; chunkID = readChunkID(); size -= 4; switch (chunkID) { case CKID_INFO: processINFO(size); break; case CKID_LINS: processLINS(size); break; case CKID_INS: processINS(size); break; default: skip(size); } } void Riff::processDLS(int size) { quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; switch (chunkID) { case CKID_VERS: m_version = readDLSVersion(); //qDebug() << "Version: " << m_version; break; case CKID_LIST: processDLSList(length); break; default: skip(length); } size -= length; } //qDebug() << "DLS:" << m_name << m_version << m_copyright; emit signalDLS(m_name, m_version, m_copyright); } void Riff::processSF(int size) { quint32 chunkID = 0; int length; while (size > 0) { if (m_IOStream->atEnd()) return; length = readChunk(chunkID); size -= 8; if (m_IOStream->atEnd()) return; if (chunkID == CKID_LIST) processSFList(length); else skip(length); size -= length; } //qDebug() << "SoundFont:" << m_name << m_version << m_copyright; emit signalSoundFont(m_name, m_version, m_copyright); } void Riff::read() { quint32 chunkID; quint32 length = readExpectedChunk(CKID_RIFF); if (length > 0) { chunkID = readChunkID(); length -= 4; switch(chunkID) { case CKID_DLS: //qDebug() << "DLS format"; processDLS(length); break; case CKID_SFBK: //qDebug() << "SoundFont format"; processSF(length); break; default: qWarning() << "Unsupported format"; } } } vmpk-0.4.0/src/pianokeybd.cpp0000644000175000001440000002265111572642326015156 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "pianokeybd.h" PianoKeybd::PianoKeybd(QWidget *parent) : QGraphicsView(parent), m_rotation(0), m_scene(NULL), m_rawMap(NULL) { initialize(); initScene(3, 5); } PianoKeybd::PianoKeybd(const int baseOctave, const int numOctaves, QWidget *parent) : QGraphicsView(parent), m_rotation(0), m_scene(NULL), m_rawMap(NULL) { initialize(); initScene(baseOctave, numOctaves); } PianoKeybd::~PianoKeybd() { setRawKeyboardMode(false); setRawKeyboardMap(NULL); } void PianoKeybd::initScene(int base, int num, const QColor& c) { m_scene = new PianoScene(base, num, c, this); m_scene->setKeyboardMap(&m_defaultMap); connect(m_scene, SIGNAL(noteOn(int,int)), SIGNAL(noteOn(int,int))); connect(m_scene, SIGNAL(noteOff(int,int)), SIGNAL(noteOff(int,int))); setScene(m_scene); } void PianoKeybd::initialize() { setAttribute(Qt::WA_AcceptTouchEvents); setAttribute(Qt::WA_InputMethodEnabled, false); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setCacheMode(CacheBackground); setViewportUpdateMode(MinimalViewportUpdate); setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing|QPainter::SmoothPixmapTransform); setOptimizationFlag(DontClipPainter, true); setOptimizationFlag(DontSavePainterState, true); setOptimizationFlag(DontAdjustForAntialiasing, true); setBackgroundBrush(QApplication::palette().background()); initDefaultMap(); #if defined(RAWKBD_SUPPORT) RawKeybdApp* rapp = dynamic_cast(qApp); if (rapp != NULL) { rapp->setRawKbdHandler(this); } #endif } void PianoKeybd::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); fitInView(m_scene->sceneRect(), Qt::KeepAspectRatio); } void PianoKeybd::showNoteOn(int midiNote, int vel) { m_scene->showNoteOn(midiNote, vel); } void PianoKeybd::showNoteOff(int midiNote, int vel) { m_scene->showNoteOff(midiNote, vel); } void PianoKeybd::initDefaultMap() { // Default translated Keyboard Map m_defaultMap.insert(Qt::Key_Z, 12); m_defaultMap.insert(Qt::Key_S, 13); m_defaultMap.insert(Qt::Key_X, 14); m_defaultMap.insert(Qt::Key_D, 15); m_defaultMap.insert(Qt::Key_C, 16); m_defaultMap.insert(Qt::Key_V, 17); m_defaultMap.insert(Qt::Key_G, 18); m_defaultMap.insert(Qt::Key_B, 19); m_defaultMap.insert(Qt::Key_H, 20); m_defaultMap.insert(Qt::Key_N, 21); m_defaultMap.insert(Qt::Key_J, 22); m_defaultMap.insert(Qt::Key_M, 23); m_defaultMap.insert(Qt::Key_Q, 24); m_defaultMap.insert(Qt::Key_2, 25); m_defaultMap.insert(Qt::Key_W, 26); m_defaultMap.insert(Qt::Key_3, 27); m_defaultMap.insert(Qt::Key_E, 28); m_defaultMap.insert(Qt::Key_R, 29); m_defaultMap.insert(Qt::Key_5, 30); m_defaultMap.insert(Qt::Key_T, 31); m_defaultMap.insert(Qt::Key_6, 32); m_defaultMap.insert(Qt::Key_Y, 33); m_defaultMap.insert(Qt::Key_7, 34); m_defaultMap.insert(Qt::Key_U, 35); m_defaultMap.insert(Qt::Key_I, 36); m_defaultMap.insert(Qt::Key_9, 37); m_defaultMap.insert(Qt::Key_O, 38); m_defaultMap.insert(Qt::Key_0, 39); m_defaultMap.insert(Qt::Key_P, 40); // Default Raw Keyboard Map #if defined(Q_WS_X11) m_defaultRawMap.insert(94, 11); m_defaultRawMap.insert(52, 12); m_defaultRawMap.insert(39, 13); m_defaultRawMap.insert(53, 14); m_defaultRawMap.insert(40, 15); m_defaultRawMap.insert(54, 16); m_defaultRawMap.insert(55, 17); m_defaultRawMap.insert(42, 18); m_defaultRawMap.insert(56, 19); m_defaultRawMap.insert(43, 20); m_defaultRawMap.insert(57, 21); m_defaultRawMap.insert(44, 22); m_defaultRawMap.insert(58, 23); m_defaultRawMap.insert(59, 24); m_defaultRawMap.insert(46, 25); m_defaultRawMap.insert(60, 26); m_defaultRawMap.insert(47, 27); m_defaultRawMap.insert(61, 28); m_defaultRawMap.insert(24, 29); m_defaultRawMap.insert(11, 30); m_defaultRawMap.insert(25, 31); m_defaultRawMap.insert(12, 32); m_defaultRawMap.insert(26, 33); m_defaultRawMap.insert(13, 34); m_defaultRawMap.insert(27, 35); m_defaultRawMap.insert(28, 36); m_defaultRawMap.insert(15, 37); m_defaultRawMap.insert(29, 38); m_defaultRawMap.insert(16, 39); m_defaultRawMap.insert(30, 40); m_defaultRawMap.insert(31, 41); m_defaultRawMap.insert(18, 42); m_defaultRawMap.insert(32, 43); m_defaultRawMap.insert(19, 44); m_defaultRawMap.insert(33, 45); m_defaultRawMap.insert(20, 46); m_defaultRawMap.insert(34, 47); m_defaultRawMap.insert(35, 48); #endif #if defined(Q_WS_WIN) m_defaultRawMap.insert(86, 11); m_defaultRawMap.insert(44, 12); m_defaultRawMap.insert(31, 13); m_defaultRawMap.insert(45, 14); m_defaultRawMap.insert(32, 15); m_defaultRawMap.insert(46, 16); m_defaultRawMap.insert(47, 17); m_defaultRawMap.insert(34, 18); m_defaultRawMap.insert(48, 19); m_defaultRawMap.insert(35, 20); m_defaultRawMap.insert(49, 21); m_defaultRawMap.insert(36, 22); m_defaultRawMap.insert(50, 23); m_defaultRawMap.insert(51, 24); m_defaultRawMap.insert(38, 25); m_defaultRawMap.insert(52, 26); m_defaultRawMap.insert(39, 27); m_defaultRawMap.insert(53, 28); m_defaultRawMap.insert(16, 29); m_defaultRawMap.insert(3, 30); m_defaultRawMap.insert(17, 31); m_defaultRawMap.insert(4, 32); m_defaultRawMap.insert(18, 33); m_defaultRawMap.insert(5, 34); m_defaultRawMap.insert(19, 35); m_defaultRawMap.insert(20, 36); m_defaultRawMap.insert(7, 37); m_defaultRawMap.insert(21, 38); m_defaultRawMap.insert(8, 39); m_defaultRawMap.insert(22, 40); m_defaultRawMap.insert(23, 41); m_defaultRawMap.insert(10, 42); m_defaultRawMap.insert(24, 43); m_defaultRawMap.insert(11, 44); m_defaultRawMap.insert(25, 45); m_defaultRawMap.insert(12, 46); m_defaultRawMap.insert(26, 47); m_defaultRawMap.insert(27, 48); #endif #if defined(Q_WS_MAC) m_defaultRawMap.insert(50, 11); m_defaultRawMap.insert(6, 12); m_defaultRawMap.insert(1, 13); m_defaultRawMap.insert(7, 14); m_defaultRawMap.insert(2, 15); m_defaultRawMap.insert(8, 16); m_defaultRawMap.insert(9, 17); m_defaultRawMap.insert(5, 18); m_defaultRawMap.insert(11, 19); m_defaultRawMap.insert(4, 20); m_defaultRawMap.insert(45, 21); m_defaultRawMap.insert(38, 22); m_defaultRawMap.insert(46, 23); m_defaultRawMap.insert(43, 24); m_defaultRawMap.insert(37, 25); m_defaultRawMap.insert(47, 26); m_defaultRawMap.insert(41, 27); m_defaultRawMap.insert(44, 28); m_defaultRawMap.insert(12, 29); m_defaultRawMap.insert(19, 30); m_defaultRawMap.insert(13, 31); m_defaultRawMap.insert(20, 32); m_defaultRawMap.insert(14, 33); m_defaultRawMap.insert(21, 34); m_defaultRawMap.insert(15, 35); m_defaultRawMap.insert(17, 36); m_defaultRawMap.insert(22, 37); m_defaultRawMap.insert(16, 38); m_defaultRawMap.insert(26, 39); m_defaultRawMap.insert(32, 40); m_defaultRawMap.insert(34, 41); m_defaultRawMap.insert(25, 42); m_defaultRawMap.insert(31, 43); m_defaultRawMap.insert(29, 44); m_defaultRawMap.insert(35, 45); m_defaultRawMap.insert(27, 46); m_defaultRawMap.insert(33, 47); m_defaultRawMap.insert(30, 48); #endif m_rawMap = &m_defaultRawMap; } void PianoKeybd::setNumOctaves(const int numOctaves) { if (numOctaves != m_scene->numOctaves()) { int baseOctave = m_scene->baseOctave(); QColor color = m_scene->getKeyPressedColor(); PianoHandler* handler = m_scene->getPianoHandler(); KeyboardMap* keyMap = m_scene->getKeyboardMap(); delete m_scene; initScene(baseOctave, numOctaves, color); m_scene->setPianoHandler(handler); m_scene->setKeyboardMap(keyMap); fitInView(m_scene->sceneRect(), Qt::KeepAspectRatio); } } void PianoKeybd::setRotation(int r) { if (r != m_rotation) { m_rotation = r; resetTransform(); rotate(m_rotation); fitInView(m_scene->sceneRect(), Qt::KeepAspectRatio); } } QSize PianoKeybd::sizeHint() const { return mapFromScene(sceneRect()).boundingRect().size(); } #if defined(RAWKBD_SUPPORT) bool PianoKeybd::handleKeyPressed(int keycode) { if (m_rawMap != NULL && m_rawMap->contains(keycode)) { m_scene->keyOn(m_rawMap->value(keycode)); return true; } return false; } bool PianoKeybd::handleKeyReleased(int keycode) { if (m_rawMap != NULL && m_rawMap->contains(keycode)) { m_scene->keyOff(m_rawMap->value(keycode)); return true; } return false; } #endif void PianoKeybd::retranslate() { m_scene->retranslate(); } vmpk-0.4.0/src/pianodefs.h0000644000175000001440000000152111572642326014437 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef PIANODEFS_H #define PIANODEFS_H #define VPIANO_EXPORT #endif // PIANODEFS_H vmpk-0.4.0/src/classicstyle.cpp0000644000175000001440000001557611572642326015543 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas Based on an original design by Thorsten Wilms. Implemented as a widget for the Rosegarden MIDI and audio sequencer and notation editor by Chris Cannam. Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas and adapted for use in QSynth. Ported to Qt4 by Chris Cannam. Adapted as a QStyle by Pedro Lopez-Cabanillas. For this file, the following copyright notices are also applicable: This file copyright 2003-2006 Chris Cannam, copyright 2005,2008 Pedro Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "classicstyle.h" #include #include #include #include #define DIAL_MIN (0.25 * M_PI) #define DIAL_MAX (1.75 * M_PI) #define DIAL_RANGE (DIAL_MAX - DIAL_MIN) static void drawTick(QPainter *p, float angle, int size, bool internal) { float hyp = float(size) / 2.0; float x0 = hyp - (hyp - 1) * qSin(angle); float y0 = hyp + (hyp - 1) * qCos(angle); if (internal) { float len = hyp / 4; float x1 = hyp - (hyp - len) * qSin(angle); float y1 = hyp + (hyp - len) * qCos(angle); p->drawLine(int(x0), int(y0), int(x1), int(y1)); } else { float len = hyp / 4; float x1 = hyp - (hyp + len) * qSin(angle); float y1 = hyp + (hyp + len) * qCos(angle); p->drawLine(int(x0), int(y0), int(x1), int(y1)); } } void ClassicStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget) const { if (cc != QStyle::CC_Dial) { QCommonStyle::drawComplexControl(cc, opt, p, widget); return; } const QStyleOptionSlider *dial = qstyleoption_cast(opt); if (dial == NULL) return; float angle = DIAL_MIN + (DIAL_RANGE * (float(dial->sliderValue - dial->minimum) / (float(dial->maximum - dial->minimum)))); int degrees = int(angle * 180.0 / M_PI); int ns = dial->tickInterval; int numTicks = 1 + (dial->maximum + ns - dial->minimum) / ns; int size = dial->rect.width() < dial->rect.height() ? dial->rect.width() : dial->rect.height(); int scale = 1; int width = size * scale; int indent = (int)(width * 0.15 + 1); QPalette pal = opt->palette; QColor knobColor = pal.mid().color(); //pal.background().color(); QColor meterColor = (dial->state & State_Enabled) ? pal.highlight().color() : pal.mid().color(); QPen pen; QColor c; p->save(); p->setRenderHint(QPainter::Antialiasing, true); p->translate(1+(dial->rect.width()-size)/2, 1+(dial->rect.height()-size)/2); // Knob body and face... pen.setColor(knobColor); pen.setWidth(scale * 2); pen.setCapStyle(Qt::FlatCap); p->setPen(pen); QRadialGradient gradient(size/2, size/2, size-indent, size/2-indent, size/2-indent); gradient.setColorAt(0, knobColor.light()); gradient.setColorAt(1, knobColor.dark()); p->setBrush(gradient); p->drawEllipse(indent, indent, width-2*indent, width-2*indent); // The bright metering bit... c = meterColor; pen.setColor(c); pen.setWidth(indent); p->setPen(pen); int arcLen = -(degrees - 45) * 16; if (arcLen == 0) arcLen = -16; p->drawArc(indent/2, indent/2, width-indent, width-indent, (180 + 45) * 16, arcLen); p->setBrush(Qt::NoBrush); // Tick notches... if (dial->subControls & QStyle::SC_DialTickmarks) { // std::cerr << "Notches visible" << std::endl; pen.setColor(pal.dark().color()); pen.setWidth(scale); p->setPen(pen); for (int i = 0; i < numTicks; ++i) { int div = numTicks; if (div > 1) --div; drawTick(p, DIAL_MIN + (DIAL_MAX - DIAL_MIN) * i / div, width, true); } } // Shadowing... pen.setWidth(scale); p->setPen(pen); // Knob shadow... int shadowAngle = -720; c = knobColor.dark(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); p->setPen(pen); p->drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle + arc, 240); p->drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle - arc, 240); c = c.light(110); } // Scale shadow... shadowAngle = 2160; c = pal.dark().color(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); p->setPen(pen); p->drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle + arc, 240); p->drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle - arc, 240); c = c.light(108); } // Undraw the bottom part... pen.setColor(pal.background().color()); pen.setWidth(scale * 4); p->setPen(pen); p->drawArc(scale/2, scale/2, width-scale, width-scale, -45 * 16, -90 * 16); // Pointer notch... float hyp = float(width) / 2.0; float len = hyp - indent; --len; float x0 = hyp; float y0 = hyp; float x = hyp - len * qSin(angle); float y = hyp + len * qCos(angle); c = pal.dark().color(); pen.setColor((dial->state & State_Enabled) ? c.dark(130) : c); pen.setWidth(scale * 2); p->setPen(pen); p->drawLine(int(x0), int(y0), int(x), int(y)); // done p->restore(); } void ClassicStyle::drawPrimitive( PrimitiveElement pe, const QStyleOption *opt, QPainter *p, const QWidget *w ) const { static QSvgRenderer onRenderer(QString(":/vpiano/led_green.svg")); static QSvgRenderer offRenderer(QString(":/vpiano/led_grey.svg")); if (pe == PE_IndicatorCheckBox) { QRect r = opt->rect; if (opt->state & State_On) onRenderer.render(p, r); else if (opt->state & State_Off) offRenderer.render(p, r); return; } else if (pe == PE_FrameFocusRect) return; QCommonStyle::drawPrimitive(pe, opt, p, w); } int ClassicStyle::pixelMetric( PixelMetric metric, const QStyleOption *option, const QWidget *widget ) const { if ( metric == PM_IndicatorWidth || metric == PM_IndicatorHeight ) return 24; return QCommonStyle::pixelMetric( metric, option, widget ); } vmpk-0.4.0/src/midisetup.cpp0000644000175000001440000001021011572642326015020 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "midisetup.h" MidiSetup::MidiSetup(QWidget *parent) : QDialog(parent) { ui.setupUi(this); connect(ui.chkEnableInput, SIGNAL(toggled(bool)), SLOT(toggledInput(bool))); #if defined(__LINUX_ALSASEQ__) || defined(__MACOSX_CORE__) ui.chkEnableInput->setEnabled(false); #endif } void MidiSetup::toggledInput(bool state) { if (!state) { ui.chkEnableThru->setChecked(false); ui.comboInput->setCurrentIndex(-1); } } void MidiSetup::inputNotAvailable() { setInputEnabled(false); ui.chkEnableInput->setEnabled(false); ui.chkEnableThru->setEnabled(false); ui.comboInput->setCurrentIndex(-1); } bool MidiSetup::inputIsEnabled() const { return ui.chkEnableInput->isChecked(); } bool MidiSetup::thruIsEnabled() const { return ui.chkEnableThru->isChecked(); } void MidiSetup::setInputEnabled(const bool state) { ui.chkEnableInput->setChecked(state); } void MidiSetup::setThruEnabled(const bool state) { ui.chkEnableThru->setChecked(state); } void MidiSetup::clearCombos() { ui.comboInput->clear(); ui.comboOutput->clear(); } void MidiSetup::addInputPortName(const QString& input, int index) { ui.comboInput->addItem(input, index); } void MidiSetup::setCurrentInput(int index) { if (index < 0) ui.comboInput->setCurrentIndex(index); else { int i; for (i = 0; i < ui.comboInput->count(); ++i) { if (index == ui.comboInput->itemData(i).toInt()) { ui.comboInput->setCurrentIndex(i); return; } } } } void MidiSetup::setCurrentInput(const QString name) { int i; for (i = 0; i < ui.comboInput->count(); ++i) { if (name == ui.comboInput->itemText(i)) { ui.comboInput->setCurrentIndex(i); return; } } ui.comboInput->setCurrentIndex(-1); } void MidiSetup::setCurrentOutput(int index) { if (index < 0) ui.comboOutput->setCurrentIndex(index); else { int i; for (i = 0; i < ui.comboOutput->count(); ++i) { if (index == ui.comboOutput->itemData(i).toInt()) { ui.comboOutput->setCurrentIndex(i); return; } } } } void MidiSetup::setCurrentOutput(const QString name) { int i; for (i = 0; i < ui.comboOutput->count(); ++i) { if (name == ui.comboOutput->itemText(i)) { ui.comboOutput->setCurrentIndex(i); return; } } ui.comboOutput->setCurrentIndex(-1); } void MidiSetup::addOutputPortName(const QString& output, int index) { ui.comboOutput->addItem(output, index); } int MidiSetup::selectedInput() { int idx = ui.comboInput->currentIndex(); if (idx >= 0) return ui.comboInput->itemData(idx).toInt(); else return -1; } int MidiSetup::selectedOutput() { int idx = ui.comboOutput->currentIndex(); if (idx >= 0) return ui.comboOutput->itemData(idx).toInt(); else return -1; } QString MidiSetup::selectedInputName() const { int idx = ui.comboInput->currentIndex(); if (idx >= 0) return ui.comboInput->itemText(idx); else return QString(); } QString MidiSetup::selectedOutputName() const { int idx = ui.comboOutput->currentIndex(); if (idx >= 0) return ui.comboOutput->itemText(idx); else return QString(); } void MidiSetup::retranslateUi() { ui.retranslateUi(this); } vmpk-0.4.0/src/rawkeybdapp.cpp0000644000175000001440000001164511572642326015343 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #if defined(RAWKBD_SUPPORT) #include "rawkeybdapp.h" #if defined(Q_WS_X11) #include #include struct qt_auto_repeat_data { // match the window and keycode with timestamp delta of 10 ms Window window; KeyCode keycode; Time timestamp; // queue scanner state bool release; bool error; }; #if defined(Q_C_CALLBACKS) extern "C" { #endif static Bool qt_keypress_scanner(Display *, XEvent *event, XPointer arg) { if (event->type != KeyPress && event->type != KeyRelease) return false; qt_auto_repeat_data *data = (qt_auto_repeat_data *) arg; if (data->error) return false; if (event->xkey.window != data->window || event->xkey.keycode != data->keycode) { // deal breakers: key events in a different window or an event // with a different key code data->error = true; return false; } if (event->type == KeyPress) { data->error = (! data->release || event->xkey.time - data->timestamp > 10); return (! data->error); } // must be XKeyRelease event if (data->release) { // found a second release data->error = true; return false; } // found a single release data->release = true; data->timestamp = event->xkey.time; return false; } #if defined(Q_C_CALLBACKS) } #endif bool RawKeybdApp::x11EventFilter ( XEvent * event ) { if ( m_enabled && m_handler != NULL && (event->type == KeyPress || event->type == KeyRelease )) { bool autorepeat = false; Display *dpy = QX11Info::display(); // was this the last auto-repeater? qt_auto_repeat_data auto_repeat_data; auto_repeat_data.window = event->xkey.window; auto_repeat_data.keycode = event->xkey.keycode; auto_repeat_data.timestamp = event->xkey.time; static uint curr_autorep = 0; if (event->type == KeyPress) { if (curr_autorep == event->xkey.keycode) { autorepeat = true; curr_autorep = 0; } } else { // look ahead for auto-repeat XEvent nextpress; auto_repeat_data.release = true; auto_repeat_data.error = false; autorepeat = XCheckIfEvent( dpy, &nextpress, &qt_keypress_scanner, (XPointer) &auto_repeat_data ); curr_autorep = autorepeat ? event->xkey.keycode : 0; } if (!autorepeat) { if (event->type == KeyPress) return m_handler->handleKeyPressed(event->xkey.keycode); else return m_handler->handleKeyReleased(event->xkey.keycode); } return true; } return false; } #endif #if defined(Q_WS_WIN) #include /* http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx */ bool RawKeybdApp::winEventFilter ( MSG * msg, long * result ) { if ( m_enabled && m_handler != NULL && (msg->message == WM_KEYDOWN || msg->message == WM_KEYUP )) { int keycode = HIWORD(msg->lParam) & 0xff; bool autorepeat = (msg->message == WM_KEYDOWN) && ((HIWORD(msg->lParam) & 0x4000) != 0); if (!autorepeat) { if ( msg->message == WM_KEYDOWN ) return m_handler->handleKeyPressed(keycode); else return m_handler->handleKeyReleased(keycode); } return true; } return false; } #endif #if defined(Q_WS_MAC) #include bool RawKeybdApp::macEventFilter( EventHandlerCallRef /*caller*/, EventRef event ) { if (m_enabled && m_handler != NULL && GetEventClass(event) == kEventClassKeyboard) { UInt32 ekind = GetEventKind(event); if (ekind == kEventRawKeyUp || ekind == kEventRawKeyDown) { UInt32 keyCode = 0; GetEventParameter(event, kEventParamKeyCode, typeUInt32, 0, sizeof(keyCode), 0, &keyCode); if ( ekind == kEventRawKeyDown ) return m_handler->handleKeyPressed(keyCode); else return m_handler->handleKeyReleased(keyCode); } return true; } return false; } #endif // Q_WS_MAC #endif // RAWKBD_SUPPORT vmpk-0.4.0/src/about.cpp0000644000175000001440000000342111572642326014135 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "about.h" #include "constants.h" About::About(QWidget *parent) : QDialog(parent) { ui.setupUi(this); retranslateUi(); #if defined(SMALL_SCREEN) setWindowState(Qt::WindowActive | Qt::WindowMaximized); #else setMinimumSize(550,580); #endif } void About::retranslateUi() { ui.retranslateUi(this); ui.labelVersion->setText(tr("" "" "" "" "" "" "

" "Version: %1
" "Build date: %2
" "Build time: %3
" "Compiler: %4" "

" "" "").arg(PGM_VERSION, BLD_DATE, BLD_TIME, CMP_VERSION)); } vmpk-0.4.0/src/vpiano.cpp0000644000175000001440000021302011572642326014315 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "vpiano.h" #include "instrument.h" #include "mididefs.h" #include "knob.h" #include "classicstyle.h" #include "RtMidi.h" #include "constants.h" #include "riffimportdlg.h" #include "extracontrols.h" #include "about.h" #include "preferences.h" #include "midisetup.h" #include "events.h" #if !defined(SMALL_SCREEN) #include "kmapdialog.h" #include "shortcutdialog.h" #endif #if ENABLE_DBUS #include "vmpk_adaptor.h" #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include VPiano::VPiano( QWidget * parent, Qt::WindowFlags flags ) : QMainWindow(parent, flags), m_midiout(0), m_midiin(0), m_currentOut(-1), m_currentIn(-1), m_inputActive(false), m_midiThru(false), m_initialized(false), m_dlgAbout(0), m_dlgPreferences(0), m_dlgMidiSetup(0), m_dlgKeyMap(0), m_dlgExtra(0), m_dlgRiffImport(0) { #if ENABLE_DBUS new VmpkAdaptor(this); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject("/", this); dbus.registerService("net.sourceforge.vmpk"); #endif m_trq = new QTranslator(this); m_trp = new QTranslator(this); m_trq->load( QSTR_QTPX + configuredLanguage(), QLibraryInfo::location(QLibraryInfo::TranslationsPath) ); m_trp->load( QSTR_VMPKPX + configuredLanguage(), VPiano::localeDirectory() ); QCoreApplication::installTranslator(m_trq); QCoreApplication::installTranslator(m_trp); ui.setupUi(this); initLanguages(); connect(ui.actionAbout, SIGNAL(triggered()), SLOT(slotAbout())); connect(ui.actionAboutQt, SIGNAL(triggered()), SLOT(slotAboutQt())); connect(ui.actionAboutTranslation, SIGNAL(triggered()), SLOT(slotAboutTranslation())); connect(ui.actionConnections, SIGNAL(triggered()), SLOT(slotConnections())); connect(ui.actionPreferences, SIGNAL(triggered()), SLOT(slotPreferences())); connect(ui.actionEditKM, SIGNAL(triggered()), SLOT(slotEditKeyboardMap())); connect(ui.actionContents, SIGNAL(triggered()), SLOT(slotHelpContents())); connect(ui.actionWebSite, SIGNAL(triggered()), SLOT(slotOpenWebSite())); connect(ui.actionImportSoundFont, SIGNAL(triggered()), SLOT(slotImportSF())); connect(ui.actionEditExtraControls, SIGNAL(triggered()), SLOT(slotEditExtraControls())); connect(ui.actionNoteNames, SIGNAL(triggered()), SLOT(slotShowNoteNames())); connect(ui.actionShortcuts, SIGNAL(triggered()), SLOT(slotShortcuts())); // Toolbars actions: toggle view connect(ui.toolBarNotes->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionNotes, SLOT(setChecked(bool))); connect(ui.toolBarControllers->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionControllers, SLOT(setChecked(bool))); connect(ui.toolBarBender->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionBender, SLOT(setChecked(bool))); connect(ui.toolBarPrograms->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionPrograms, SLOT(setChecked(bool))); connect(ui.toolBarExtra->toggleViewAction(), SIGNAL(toggled(bool)), ui.actionExtraControls, SLOT(setChecked(bool))); #if defined(SMALL_SCREEN) ui.toolBarControllers->hide(); ui.toolBarBender->hide(); ui.toolBarExtra->hide(); //ui.toolBarNotes->hide(); //ui.toolBarPrograms->hide(); ui.actionEditKM->setVisible(false); ui.actionShortcuts->setVisible(false); ui.actionStatusBar->setVisible(false); setWindowTitle("VMPK " + PGM_VERSION); #endif ui.pianokeybd->setPianoHandler(this); initialization(); } VPiano::~VPiano() { try { if (m_midiout != 0) { m_midiout->closePort(); delete m_midiout; } if (m_midiin != 0) { if (m_inputActive) { m_midiin->cancelCallback(); m_inputActive = false; } if (m_currentIn > -1) m_midiin->closePort(); delete m_midiin; } } catch (RtError& err) { qWarning() << QString::fromStdString(err.getMessage()); } } void VPiano::initialization() { if ((m_initialized = initMidi())) { refreshConnections(); readSettings(); createLanguageMenu(); initToolBars(); applyPreferences(); applyConnections(); applyInitialSettings(); initExtraControllers(); activateWindow(); } } int VPiano::getInputChannel() { return m_channel; } void midiCallback( double /*deltatime*/, std::vector< unsigned char > *message, void *userData ) { QEvent* ev = 0; VPiano* instance = static_cast(userData); instance->midiThru(message); unsigned char status = message->at(0) & MASK_STATUS; unsigned char channel = message->at(0) & MASK_CHANNEL; unsigned char channelFilter = instance->getInputChannel(); if (channel == channelFilter) { switch( status ) { case STATUS_NOTEOFF: case STATUS_NOTEON: { unsigned char midi_note = message->at(1); unsigned char vel = message->at(2); if ((status == STATUS_NOTEOFF) || (vel == 0)) ev = new NoteOffEvent(midi_note, vel); else ev = new NoteOnEvent(midi_note, vel); } break; case STATUS_POLYAFT: { unsigned char note = message->at(1); unsigned char value = message->at(2); ev = new PolyKeyPressEvent(note, value); } break; case STATUS_CTLCHG: { unsigned char ctl = message->at(1); unsigned char val = message->at(2); ev = new ControlChangeEvent(ctl, val); } break; case STATUS_PROGRAM: { unsigned char value = message->at(1); ev = new ProgramChangeEvent(value); } break; case STATUS_CHANAFT: { unsigned char value = message->at(1); ev = new ChannelKeyPressEvent(value); } break; case STATUS_BENDER: { int value = (message->at(1) + 0x80 * message->at(2)) - BENDER_MID; ev = new PitchWheelEvent(value); } break; } } if (ev != 0) QApplication::postEvent(instance, ev); } bool VPiano::initMidi() { try { m_midiout = new RtMidiOut(QSTR_VMPKOUTPUT.toStdString()); m_midiin = new RtMidiIn(QSTR_VMPKINPUT.toStdString()); #if !defined(__LINUX_ALSASEQ__) && !defined(__MACOSX_CORE__) && !defined(__LINUX_JACK__) int nOutPorts = m_midiout->getPortCount(); if (nOutPorts == 0) { delete m_midiout; m_midiout = 0; QMessageBox::critical( this, tr("Error"), tr("No MIDI output ports available. Aborting") ); return false; } int nInPorts = m_midiin->getPortCount(); if (nInPorts == 0) { delete m_midiin; m_midiin = 0; } #endif #if defined(__LINUX_ALSASEQ__) || defined(__MACOSX_CORE__) || defined(__LINUX_JACK__) if (m_midiout != 0) m_midiout->openVirtualPort(QSTR_VMPKOUTPUT.toStdString()); if (m_midiin != 0) m_midiin->openVirtualPort(QSTR_VMPKINPUT.toStdString()); #else //if defined(__WINDOWS_MM__) || defined(__IRIX_MD__) m_midiout->openPort( m_currentOut = 0 ); #endif if (m_midiin != 0) { // ignore SYX, clock and active sense m_midiin->ignoreTypes(true,true,true); m_midiin->setCallback( &midiCallback, this ); m_inputActive = true; } } catch (RtError& err) { QMessageBox::critical( this, tr("Error. Aborting"), QString::fromStdString(err.getMessage())); return false; } return true; } void VPiano::initToolBars() { //QLabel *lbl; m_dialStyle = new ClassicStyle(); m_dialStyle->setParent(this); // Notes tool bar QWidget *w = ui.toolBarNotes->widgetForAction(ui.actionPanic); w->setMaximumWidth(120); m_lblChannel = new QLabel( #if defined(SMALL_SCREEN) tr("Chan:") #else tr("Channel:") #endif , this); ui.toolBarNotes->addWidget(m_lblChannel); m_lblChannel->setMargin(TOOLBARLABELMARGIN); m_sboxChannel = new QSpinBox(this); m_sboxChannel->setMinimum(1); m_sboxChannel->setMaximum(MIDICHANNELS); m_sboxChannel->setValue(m_channel + 1); m_sboxChannel->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_sboxChannel); m_lblBaseOctave = new QLabel( #if defined(SMALL_SCREEN) tr("Oct:") #else tr("Base Octave:") #endif , this); ui.toolBarNotes->addWidget(m_lblBaseOctave); m_lblBaseOctave->setMargin(TOOLBARLABELMARGIN); m_sboxOctave = new QSpinBox(this); m_sboxOctave->setMinimum(0); m_sboxOctave->setMaximum(9); m_sboxOctave->setValue(m_baseOctave); m_sboxOctave->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_sboxOctave); m_lblTranspose = new QLabel( #if defined(SMALL_SCREEN) tr("Trans:") #else tr("Transpose:") #endif , this); ui.toolBarNotes->addWidget(m_lblTranspose); m_lblTranspose->setMargin(TOOLBARLABELMARGIN); m_sboxTranspose = new QSpinBox(this); m_sboxTranspose->setMinimum(-11); m_sboxTranspose->setMaximum(11); m_sboxTranspose->setValue(m_transpose); m_sboxTranspose->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_sboxTranspose); m_lblVelocity = new QLabel( #if defined(SMALL_SCREEN) tr("Vel:") #else tr("Velocity:") #endif , this); ui.toolBarNotes->addWidget(m_lblVelocity); m_lblVelocity->setMargin(TOOLBARLABELMARGIN); m_Velocity = new Knob(this); m_Velocity->setFixedSize(32, 32); m_Velocity->setStyle(dlgPreferences()->getStyledWidgets()? m_dialStyle : 0); m_Velocity->setMinimum(0); m_Velocity->setMaximum(127); m_Velocity->setDefaultValue(MIDIVELOCITY); m_Velocity->setDialMode(Knob::LinearMode); m_Velocity->setValue(m_velocity); m_Velocity->setToolTip(QString::number(m_velocity)); m_Velocity->setFocusPolicy(Qt::NoFocus); ui.toolBarNotes->addWidget(m_Velocity); connect( m_sboxChannel, SIGNAL(valueChanged(int)), SLOT(slotChannelValueChanged(int)) ); connect( m_sboxOctave, SIGNAL(valueChanged(int)), SLOT(slotBaseOctaveValueChanged(int)) ); connect( m_sboxTranspose, SIGNAL(valueChanged(int)), SLOT(slotTransposeValueChanged(int)) ); connect( m_Velocity, SIGNAL(valueChanged(int)), SLOT(slotVelocityValueChanged(int)) ); connect( ui.actionChannelUp, SIGNAL(triggered()), m_sboxChannel, SLOT(stepUp()) ); connect( ui.actionChannelDown, SIGNAL(triggered()), m_sboxChannel, SLOT(stepDown()) ); connect( ui.actionOctaveUp, SIGNAL(triggered()), m_sboxOctave, SLOT(stepUp()) ); connect( ui.actionOctaveDown, SIGNAL(triggered()), m_sboxOctave, SLOT(stepDown()) ); connect( ui.actionTransposeUp, SIGNAL(triggered()), m_sboxTranspose, SLOT(stepUp()) ); connect( ui.actionTransposeDown, SIGNAL(triggered()), m_sboxTranspose, SLOT(stepDown()) ); connect( ui.actionVelocityUp, SIGNAL(triggered()), SLOT(slotVelocityUp()) ); connect( ui.actionVelocityDown, SIGNAL(triggered()), SLOT(slotVelocityDown()) ); // Controllers tool bar m_lblControl = new QLabel(tr("Control:"), this); ui.toolBarControllers->addWidget(m_lblControl); m_lblControl ->setMargin(TOOLBARLABELMARGIN); m_comboControl = new QComboBox(this); m_comboControl->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_comboControl->setFocusPolicy(Qt::NoFocus); ui.toolBarControllers->addWidget(m_comboControl); m_lblValue = new QLabel(tr("Value:"), this); ui.toolBarControllers->addWidget(m_lblValue); m_lblValue->setMargin(TOOLBARLABELMARGIN); m_Control= new Knob(this); m_Control->setFixedSize(32, 32); m_Control->setStyle(dlgPreferences()->getStyledWidgets()? m_dialStyle : 0); m_Control->setMinimum(0); m_Control->setMaximum(127); m_Control->setValue(0); m_Control->setToolTip("0"); m_Control->setDefaultValue(0); m_Control->setDialMode(Knob::LinearMode); m_Control->setFocusPolicy(Qt::NoFocus); ui.toolBarControllers->addWidget(m_Control); connect( m_comboControl, SIGNAL(currentIndexChanged(int)), SLOT(slotComboControlCurrentIndexChanged(int)) ); connect( m_Control, SIGNAL(sliderMoved(int)), SLOT(slotControlSliderMoved(int)) ); // Pitch bender tool bar m_lblBender = new QLabel(tr("Bender:"), this); ui.toolBarBender->addWidget(m_lblBender); m_lblBender->setMargin(TOOLBARLABELMARGIN); m_bender = new QSlider(this); m_bender->setOrientation(Qt::Horizontal); m_bender->setMaximumWidth(200); m_bender->setMinimum(BENDER_MIN); m_bender->setMaximum(BENDER_MAX); m_bender->setValue(0); m_bender->setToolTip("0"); m_bender->setFocusPolicy(Qt::NoFocus); ui.toolBarBender->addWidget(m_bender); connect( m_bender, SIGNAL(sliderMoved(int)), SLOT(slotBenderSliderMoved(int)) ); connect( m_bender, SIGNAL(sliderReleased()), SLOT(slotBenderSliderReleased()) ); // Programs tool bar m_lblBank = new QLabel(tr("Bank:"), this); ui.toolBarPrograms->addWidget(m_lblBank); m_lblBank->setMargin(TOOLBARLABELMARGIN); m_comboBank = new QComboBox(this); m_comboBank->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_comboBank->setFocusPolicy(Qt::NoFocus); ui.toolBarPrograms->addWidget(m_comboBank); m_lblProgram = new QLabel(tr("Program:"), this); ui.toolBarPrograms->addWidget(m_lblProgram); m_lblProgram->setMargin(TOOLBARLABELMARGIN); m_comboProg = new QComboBox(this); m_comboProg->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_comboProg->setFocusPolicy(Qt::NoFocus); ui.toolBarPrograms->addWidget(m_comboProg); connect( m_comboBank, SIGNAL(activated(int)), SLOT(slotComboBankActivated(int)) ); connect( m_comboProg, SIGNAL(activated(int)), SLOT(slotComboProgActivated(int)) ); // Toolbars actions: buttons connect( ui.actionPanic, SIGNAL(triggered()), SLOT(slotPanic())); connect( ui.actionResetAll, SIGNAL(triggered()), SLOT(slotResetAllControllers())); connect( ui.actionReset, SIGNAL(triggered()), SLOT(slotResetBender())); connect( ui.actionEditExtra, SIGNAL(triggered()), SLOT(slotEditExtraControls())); // Tools actions connect( ui.actionNextBank, SIGNAL(triggered()), SLOT(slotBankNext()) ); connect( ui.actionPreviousBank, SIGNAL(triggered()), SLOT(slotBankPrev()) ); connect( ui.actionNextProgram, SIGNAL(triggered()), SLOT(slotProgramNext()) ); connect( ui.actionPreviousProgram, SIGNAL(triggered()), SLOT(slotProgramPrev()) ); connect( ui.actionNextController, SIGNAL(triggered()), SLOT(slotControllerNext()) ); connect( ui.actionPreviousController, SIGNAL(triggered()), SLOT(slotControllerPrev()) ); connect( ui.actionControllerDown, SIGNAL(triggered()), SLOT(slotControllerDown()) ); connect( ui.actionControllerUp, SIGNAL(triggered()), SLOT(slotControllerUp()) ); /* connect( ui.actionEditPrograms, SIGNAL(triggered()), SLOT(slotEditPrograms())); */ } //void VPiano::slotDebugDestroyed(QObject *obj) //{ // qDebug() << Q_FUNC_INFO << obj->metaObject()->className(); //} void VPiano::clearExtraControllers() { QList allActs = ui.toolBarExtra->actions(); foreach(QAction* a, allActs) { if (a != ui.actionEditExtra) { ui.toolBarExtra->removeAction(a); delete a; } } ui.toolBarExtra->clear(); ui.toolBarExtra->addAction(ui.actionEditExtra); ui.toolBarExtra->addSeparator(); } QByteArray VPiano::readSysexDataFile(const QString& fileName) { QFile file(fileName); file.open(QIODevice::ReadOnly); QByteArray res = file.readAll(); file.close(); return res; } void VPiano::initExtraControllers() { QWidget *w = 0; QCheckBox *chkbox = 0; Knob *knob = 0; QSpinBox *spin = 0; QSlider *slider = 0; QToolButton *button = 0; foreach(const QString& s, m_extraControls) { QString lbl; int control = 0; int type = 0; int minValue = 0; int maxValue = 127; int defValue = 0; int value = 0; int size = 100; QString fileName; ExtraControl::decodeString( s, lbl, control, type, minValue, maxValue, defValue, size, fileName ); if (m_ctlState[m_channel].contains(control)) value = m_ctlState[m_channel][control]; else value = defValue; switch(type) { case 0: chkbox = new QCheckBox(this); chkbox->setStyle(dlgPreferences()->getStyledWidgets() ? m_dialStyle : 0); chkbox->setProperty(MIDICTLONVALUE, maxValue); chkbox->setProperty(MIDICTLOFFVALUE, minValue); chkbox->setChecked(bool(value)); connect(chkbox, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool))); w = chkbox; break; case 1: knob = new Knob(this); knob->setFixedSize(32, 32); knob->setStyle(dlgPreferences()->getStyledWidgets() ? m_dialStyle : 0); knob->setMinimum(minValue); knob->setMaximum(maxValue); knob->setValue(value); knob->setToolTip(QString::number(value)); knob->setDefaultValue(defValue); knob->setDialMode(Knob::LinearMode); connect(knob, SIGNAL(sliderMoved(int)), SLOT(slotExtraController(int))); w = knob; break; case 2: spin = new QSpinBox(this); spin->setMinimum(minValue); spin->setMaximum(maxValue); spin->setValue(value); connect(spin, SIGNAL(valueChanged(int)), SLOT(slotExtraController(int))); w = spin; break; case 3: slider = new QSlider(this); slider->setOrientation(Qt::Horizontal); slider->setFixedWidth(size); slider->setMinimum(minValue); slider->setMaximum(maxValue); slider->setToolTip(QString::number(value)); slider->setValue(value); connect(slider, SIGNAL(sliderMoved(int)), SLOT(slotExtraController(int))); w = slider; break; case 4: button = new QToolButton(this); button->setText(lbl); button->setProperty(MIDICTLONVALUE, maxValue); button->setProperty(MIDICTLOFFVALUE, minValue); connect(button, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool))); w = button; break; case 5: control = 255; button = new QToolButton(this); button->setText(lbl); button->setProperty(SYSEXFILENAME, fileName); button->setProperty(SYSEXFILEDATA, readSysexDataFile(fileName)); connect(button, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool))); w = button; break; default: w = 0; } if (w != 0) { if (!lbl.isEmpty() && type < 4) { QLabel *qlbl = new QLabel(lbl, this); qlbl->setMargin(TOOLBARLABELMARGIN); ui.toolBarExtra->addWidget(qlbl); //connect(qlbl, SIGNAL(destroyed(QObject*)), SLOT(slotDebugDestroyed(QObject*))); } w->setProperty(MIDICTLNUMBER, control); w->setFocusPolicy(Qt::NoFocus); ui.toolBarExtra->addWidget(w); //connect(w, SIGNAL(destroyed(QObject*)), SLOT(slotDebugDestroyed(QObject*))); } } } void VPiano::readSettings() { QSettings settings; settings.beginGroup(QSTR_WINDOW); restoreGeometry(settings.value(QSTR_GEOMETRY).toByteArray()); restoreState(settings.value(QSTR_STATE).toByteArray()); settings.endGroup(); settings.beginGroup(QSTR_PREFERENCES); m_channel = settings.value(QSTR_CHANNEL, 0).toInt(); m_velocity = settings.value(QSTR_VELOCITY, MIDIVELOCITY).toInt(); m_baseOctave = settings.value(QSTR_BASEOCTAVE, 3).toInt(); m_transpose = settings.value(QSTR_TRANSPOSE, 0).toInt(); int num_octaves = settings.value(QSTR_NUMOCTAVES, DEFAULTNUMBEROFOCTAVES).toInt(); QString insFileName = settings.value(QSTR_INSTRUMENTSDEFINITION).toString(); QString insName = settings.value(QSTR_INSTRUMENTNAME).toString(); QColor keyColor = settings.value(QSTR_KEYPRESSEDCOLOR, QColor()).value(); bool grabKb = settings.value(QSTR_GRABKB, false).toBool(); bool styledKnobs = settings.value(QSTR_STYLEDKNOBS, true).toBool(); bool alwaysOnTop = settings.value(QSTR_ALWAYSONTOP, false).toBool(); bool showNames = settings.value(QSTR_SHOWNOTENAMES, false).toBool(); bool showStatusBar = settings.value(QSTR_SHOWSTATUSBAR, false).toBool(); bool velocityColor = settings.value(QSTR_VELOCITYCOLOR, true).toBool(); int drumsChannel = settings.value(QSTR_DRUMSCHANNEL, MIDIGMDRUMSCHANNEL).toInt(); #if defined(NETWORK_MIDI) g_iUdpPort = settings.value(QSTR_NETWORKPORT, NETWORKPORTNUMBER).toInt(); #endif settings.endGroup(); #if defined(NETWORK_MIDI) dlgPreferences()->setNetworkPort(g_iUdpPort); #endif dlgPreferences()->setNumOctaves(num_octaves); dlgPreferences()->setDrumsChannel(drumsChannel); dlgPreferences()->setKeyPressedColor(keyColor); dlgPreferences()->setGrabKeyboard(grabKb); dlgPreferences()->setStyledWidgets(styledKnobs); dlgPreferences()->setAlwaysOnTop(alwaysOnTop); dlgPreferences()->setVelocityColor(velocityColor); ui.actionNoteNames->setChecked(showNames); ui.actionStatusBar->setChecked(showStatusBar); ui.pianokeybd->setVelocity( velocityColor ? m_velocity : MIDIVELOCITY ); slotShowNoteNames(); if (!insFileName.isEmpty()) { dlgPreferences()->setInstrumentsFileName(insFileName); if (!insName.isEmpty()) { dlgPreferences()->setInstrumentName(insName); } } settings.beginGroup(QSTR_CONNECTIONS); bool inEnabled = settings.value(QSTR_INENABLED, true).toBool(); bool thruEnabled = settings.value(QSTR_THRUENABLED, false).toBool(); #if !defined(NETWORK_MIDI) QString in_port = settings.value(QSTR_INPORT).toString(); QString out_port = settings.value(QSTR_OUTPORT).toString(); #endif settings.endGroup(); #if defined(__LINUX_ALSASEQ__) || defined(__MACOSX_CORE__) inEnabled = true; #endif if (m_midiin == 0) { dlgMidiSetup()->inputNotAvailable(); } else { dlgMidiSetup()->setInputEnabled(inEnabled); dlgMidiSetup()->setThruEnabled(thruEnabled); #if !defined(NETWORK_MIDI) dlgMidiSetup()->setCurrentInput(in_port); #endif } #if !defined(NETWORK_MIDI) dlgMidiSetup()->setCurrentOutput(out_port); #endif settings.beginGroup(QSTR_KEYBOARD); bool rawKeyboard = settings.value(QSTR_RAWKEYBOARDMODE, false).toBool(); QString mapFile = settings.value(QSTR_MAPFILE, QSTR_DEFAULT).toString(); QString rawMapFile = settings.value(QSTR_RAWMAPFILE, QSTR_DEFAULT).toString(); settings.endGroup(); dlgPreferences()->setRawKeyboard(rawKeyboard); for (int chan=0; chan actions = findChildren (); QListIterator iter(actions); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) continue; const QString& sKey = '/' + pAction->objectName(); const QString& sValue = settings.value('/' + sKey).toString(); if (sValue.isEmpty()) continue; pAction->setShortcut(QKeySequence(sValue)); } settings.endGroup(); ui.pianokeybd->getKeyboardMap()->setRawMode(false); ui.pianokeybd->getRawKeyboardMap()->setRawMode(true); if (!mapFile.isEmpty() && mapFile != QSTR_DEFAULT) { dlgPreferences()->setKeyMapFileName(mapFile); ui.pianokeybd->setKeyboardMap(dlgPreferences()->getKeyboardMap()); } if (!rawMapFile.isEmpty() && rawMapFile != QSTR_DEFAULT) { dlgPreferences()->setRawKeyMapFileName(rawMapFile); ui.pianokeybd->setRawKeyboardMap(dlgPreferences()->getKeyboardMap()); } } void VPiano::writeSettings() { QSettings settings; settings.clear(); settings.beginGroup(QSTR_WINDOW); settings.setValue(QSTR_GEOMETRY, saveGeometry()); settings.setValue(QSTR_STATE, saveState()); settings.endGroup(); settings.beginGroup(QSTR_PREFERENCES); settings.setValue(QSTR_CHANNEL, m_channel); settings.setValue(QSTR_VELOCITY, m_velocity); settings.setValue(QSTR_BASEOCTAVE, m_baseOctave); settings.setValue(QSTR_TRANSPOSE, m_transpose); settings.setValue(QSTR_LANGUAGE, m_language); settings.setValue(QSTR_NUMOCTAVES, dlgPreferences()->getNumOctaves()); settings.setValue(QSTR_INSTRUMENTSDEFINITION, dlgPreferences()->getInstrumentsFileName()); settings.setValue(QSTR_INSTRUMENTNAME, dlgPreferences()->getInstrumentName()); settings.setValue(QSTR_KEYPRESSEDCOLOR, dlgPreferences()->getKeyPressedColor()); settings.setValue(QSTR_GRABKB, dlgPreferences()->getGrabKeyboard()); settings.setValue(QSTR_STYLEDKNOBS, dlgPreferences()->getStyledWidgets()); settings.setValue(QSTR_ALWAYSONTOP, dlgPreferences()->getAlwaysOnTop()); settings.setValue(QSTR_SHOWNOTENAMES, ui.actionNoteNames->isChecked()); settings.setValue(QSTR_SHOWSTATUSBAR, ui.actionStatusBar->isChecked()); settings.setValue(QSTR_DRUMSCHANNEL, dlgPreferences()->getDrumsChannel()); settings.setValue(QSTR_VELOCITYCOLOR, dlgPreferences()->getVelocityColor()); #if defined(NETWORK_MIDI) settings.setValue(QSTR_NETWORKPORT, dlgPreferences()->getNetworkPort()); #endif settings.endGroup(); settings.beginGroup(QSTR_CONNECTIONS); settings.setValue(QSTR_INENABLED, dlgMidiSetup()->inputIsEnabled()); settings.setValue(QSTR_THRUENABLED, dlgMidiSetup()->thruIsEnabled()); #if !defined(NETWORK_MIDI) settings.setValue(QSTR_INPORT, dlgMidiSetup()->selectedInputName()); settings.setValue(QSTR_OUTPORT, dlgMidiSetup()->selectedOutputName()); #endif settings.endGroup(); settings.beginGroup(QSTR_KEYBOARD); settings.setValue(QSTR_RAWKEYBOARDMODE, dlgPreferences()->getRawKeyboard()); settings.setValue(QSTR_MAPFILE, ui.pianokeybd->getKeyboardMap()->getFileName()); settings.setValue(QSTR_RAWMAPFILE, ui.pianokeybd->getRawKeyboardMap()->getFileName()); settings.endGroup(); for (int chan=0; chan::const_iterator it, end; it = m_ctlState[chan].constBegin(); end = m_ctlState[chan].constEnd(); for (; it != end; ++it) settings.setValue(QString::number(it.key()), it.value()); settings.endGroup(); group = QSTR_INSTRUMENT + QString::number(chan); settings.beginGroup(group); settings.setValue(QSTR_BANK, m_lastBank[chan]); settings.setValue(QSTR_PROGRAM, m_lastProg[chan]); settings.setValue(QSTR_CONTROLLER, m_lastCtl[chan]); settings.endGroup(); } settings.beginGroup(QSTR_EXTRACONTROLLERS); int i = 0; foreach(const QString& ctl, m_extraControls) { QString key = QString("%1").arg(i++, 2, 10, QChar('0')); settings.setValue(key, ctl); } settings.endGroup(); settings.beginGroup(QSTR_SHORTCUTS); QList actions = findChildren (); QListIterator iter(actions); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) continue; const QString& sKey = '/' + pAction->objectName(); const QString& sValue = QString(pAction->shortcut()); if (!sValue.isEmpty()) settings.setValue(sKey, sValue); else if (settings.contains(sKey)) settings.remove(sKey); } settings.endGroup(); settings.sync(); } void VPiano::closeEvent( QCloseEvent *event ) { //qDebug() << "closeEvent:" << event->type(); if (m_initialized) writeSettings(); event->accept(); } void VPiano::customEvent ( QEvent *event ) { //qDebug() << "customEvent:" << event->type(); if ( event->type() == NoteOnEventType ) { NoteOnEvent *ev = static_cast(event); int n = ev->getNote(); int v = (dlgPreferences()->getVelocityColor() ? ev->getValue() : MIDIVELOCITY ); ui.pianokeybd->showNoteOn(n, v); #ifdef ENABLE_DBUS emit event_noteon(n); #endif } else if ( event->type() == NoteOffEventType ) { NoteOffEvent *ev = static_cast(event); int n = ev->getNote(); ui.pianokeybd->showNoteOff(n); #ifdef ENABLE_DBUS emit event_noteoff(n); #endif } else if ( event->type() == PolyKeyPressEventType ) { #ifdef ENABLE_DBUS PolyKeyPressEvent *ev = static_cast(event); int n = ev->getNote(); int v = ev->getValue(); emit event_polykeypress(n, v); #endif } else if ( event->type() == ControlChangeEventType ) { ControlChangeEvent *ev = static_cast(event); int ctl = ev->getController(); int val = ev->getValue(); switch (ctl) { case CTL_ALL_SOUND_OFF: case CTL_ALL_NOTES_OFF: ui.pianokeybd->allKeysOff(); break; case CTL_RESET_ALL_CTL: initializeAllControllers(); break; default: updateController(ctl, val); updateExtraController(ctl, val); } #ifdef ENABLE_DBUS emit event_controlchange(ctl, val); #endif } else if ( event->type() == ProgramChangeEventType) { ProgramChangeEvent *ev = static_cast(event); int val = ev->getValue(); updateProgramChange(val); #ifdef ENABLE_DBUS emit event_programchange(val); #endif } else if ( event->type() == ChannelKeyPressEventType ) { #ifdef ENABLE_DBUS ChannelKeyPressEvent *ev = static_cast(event); int val = ev->getValue(); emit event_chankeypress(val); #endif } else if ( event->type() == PitchWheelEventType ) { PitchWheelEvent *ev = static_cast(event); int val = ev->getValue(); m_bender->setValue(val); m_bender->setToolTip(QString::number(val)); #ifdef ENABLE_DBUS emit event_pitchwheel(val); #endif } event->accept(); } void VPiano::showEvent ( QShowEvent *event ) { //qDebug() << "showEvent:" << event->type(); QMainWindow::showEvent(event); #if !defined(SMALL_SCREEN) if (m_initialized) { ui.pianokeybd->setFocus(); grabKb(); } #endif } void VPiano::hideEvent( QHideEvent *event ) { //qDebug() << "hideEvent:" << event->type(); #if !defined(SMALL_SCREEN) releaseKb(); #endif QMainWindow::hideEvent(event); } void VPiano::midiThru(std::vector *message) const { if (m_midiThru) { try { m_midiout->sendMessage( message ); } catch (RtError& err) { qWarning() << QString::fromStdString(err.getMessage()); } } } void VPiano::sendMessageWrapper(std::vector *message) const { try { m_midiout->sendMessage( message ); } catch (RtError& err) { ui.statusBar->showMessage(QString::fromStdString(err.getMessage())); } } void VPiano::sendNoteOn(const int midiNote, const int vel) { std::vector message; if ((midiNote & MASK_SAFETY) == midiNote) { unsigned char chan = static_cast(m_channel); //unsigned char vel = static_cast(m_velocity); // Note On: 0x90 + channel, note, vel message.push_back(STATUS_NOTEON + (chan & MASK_CHANNEL)); message.push_back(midiNote & MASK_SAFETY); message.push_back(vel & MASK_SAFETY); sendMessageWrapper( &message ); } } void VPiano::noteOn(const int midiNote, const int vel) { sendNoteOn(midiNote, vel); #ifdef ENABLE_DBUS emit event_noteon(midiNote); #endif } void VPiano::sendNoteOff(const int midiNote, const int vel) { std::vector message; if ((midiNote & MASK_SAFETY) == midiNote) { unsigned char chan = static_cast(m_channel); //unsigned char vel = static_cast(m_velocity); // Note Off: 0x80 + channel, note, vel message.push_back(STATUS_NOTEOFF + (chan & MASK_CHANNEL)); message.push_back(midiNote & MASK_SAFETY); message.push_back(vel & MASK_SAFETY); sendMessageWrapper( &message ); } } void VPiano::noteOff(const int midiNote, const int vel) { sendNoteOff(midiNote, vel); #ifdef ENABLE_DBUS emit event_noteoff(midiNote); #endif } void VPiano::sendController(const int controller, const int value) { std::vector message; unsigned char chan = static_cast(m_channel); unsigned char ctl = static_cast(controller); unsigned char val = static_cast(value); // Controller: 0xB0 + channel, ctl, val message.push_back(STATUS_CTLCHG + (chan & MASK_CHANNEL)); message.push_back(ctl & MASK_SAFETY); message.push_back(val & MASK_SAFETY); sendMessageWrapper( &message ); } void VPiano::resetAllControllers() { sendController(CTL_RESET_ALL_CTL, 0); initializeAllControllers(); } void VPiano::initializeAllControllers() { int index = m_comboControl->currentIndex(); int ctl = m_comboControl->itemData(index).toInt(); int val = m_ctlState[m_channel][ctl]; initControllers(m_channel); m_comboControl->setCurrentIndex(index); m_Control->setValue(val); m_Control->setToolTip(QString::number(val)); // extra controllers QList allWidgets = ui.toolBarExtra->findChildren(); foreach(QWidget *w, allWidgets) { QVariant c = w->property(MIDICTLNUMBER); if (c.isValid()) { ctl = c.toInt(); if (m_ctlState[m_channel].contains(ctl)) { val = m_ctlState[m_channel][ctl]; QVariant p = w->property("value"); if (p.isValid()) { w->setProperty("value", val); w->setToolTip(QString::number(val)); continue; } p = w->property("checked"); if (p.isValid()) { QVariant on = w->property(MIDICTLONVALUE); w->setProperty("checked", (val >= on.toInt())); } } } } } void VPiano::allNotesOff() { sendController(CTL_ALL_NOTES_OFF, 0); ui.pianokeybd->allKeysOff(); } void VPiano::sendProgramChange(const int program) { std::vector message; unsigned char chan = static_cast(m_channel); unsigned char pgm = static_cast(program); // Program: 0xC0 + channel, pgm message.push_back(STATUS_PROGRAM + (chan & MASK_CHANNEL)); message.push_back(pgm & MASK_SAFETY); sendMessageWrapper( &message ); } void VPiano::sendBankChange(const int bank) { int method = (m_ins != 0) ? m_ins->bankSelMethod() : 0; int lsb, msb; switch (method) { case 0: lsb = CALC_LSB(bank); msb = CALC_MSB(bank); sendController(CTL_MSB, msb); sendController(CTL_LSB, lsb); break; case 1: sendController(CTL_MSB, bank); break; case 2: sendController(CTL_LSB, bank); break; default: /* if method is 3 or above, do nothing */ break; } m_lastBank[m_channel] = bank; } void VPiano::sendPolyKeyPress(const int note, const int value) { std::vector message; unsigned char chan = static_cast(m_channel); unsigned char midi_note = static_cast(note); unsigned char val = static_cast(value); // Polyphonic After-touch: 0xA0 + channel, note, value message.push_back(STATUS_POLYAFT + (chan & MASK_CHANNEL)); message.push_back(midi_note & MASK_SAFETY); message.push_back(val & MASK_SAFETY); sendMessageWrapper( &message ); } void VPiano::sendChanKeyPress(const int value) { std::vector message; unsigned char chan = static_cast(m_channel); unsigned char val = static_cast(value); // Channel After-touch: 0xD0 + channel, value message.push_back(STATUS_CHANAFT + (chan & MASK_CHANNEL)); message.push_back(val & MASK_SAFETY); sendMessageWrapper( &message ); } void VPiano::sendBender(const int value) { std::vector message; int v = value + BENDER_MID; // v >= 0, v <= 16384 unsigned char chan = static_cast(m_channel); unsigned char lsb = static_cast(CALC_LSB(v)); unsigned char msb = static_cast(CALC_MSB(v)); // Program: 0xE0 + channel, lsb, msb message.push_back(STATUS_BENDER + (chan & MASK_CHANNEL)); message.push_back(lsb); message.push_back(msb); sendMessageWrapper( &message ); } void VPiano::slotPanic() { allNotesOff(); } void VPiano::slotResetAllControllers() { resetAllControllers(); } void VPiano::slotResetBender() { m_bender->setValue(0); sendBender(0); } void VPiano::sendSysex(const QByteArray& data) { std::vector message; foreach(const char byte, data) { message.push_back(byte); } sendMessageWrapper( &message ); } void VPiano::slotControlClicked(const bool boolValue) { QObject *s = sender(); QVariant p = s->property(MIDICTLNUMBER); if (p.isValid()) { int controller = p.toInt(); if (controller < 128) { QVariant on = s->property(MIDICTLONVALUE); QVariant off = s->property(MIDICTLOFFVALUE); int value = boolValue ? on.toInt() : off.toInt(); sendController( controller, value ); updateController( controller, value ); } else { QVariant data = s->property(SYSEXFILEDATA); sendSysex(data.toByteArray()); } } } void VPiano::slotVelocityValueChanged(int value) { m_velocity = value; setWidgetTip(m_Velocity, value); ui.pianokeybd->setVelocity(dlgPreferences()->getVelocityColor() ? value : MIDIVELOCITY); } void VPiano::slotExtraController(const int value) { QWidget *w = static_cast(sender()); QVariant p = w->property(MIDICTLNUMBER); if (p.isValid()) { int controller = p.toInt(); sendController( controller, value ); updateController( controller, value ); setWidgetTip(w, value); } } void VPiano::slotControlSliderMoved(const int value) { int index = m_comboControl->currentIndex(); int controller = m_comboControl->itemData(index).toInt(); sendController( controller, value ); updateExtraController( controller, value ); m_ctlState[m_channel][controller] = value; setWidgetTip(m_Control, value); } void VPiano::slotBenderSliderMoved(const int pos) { sendBender(pos); setWidgetTip(m_bender, pos); } void VPiano::slotBenderSliderReleased() { m_bender->setValue(0); sendBender(0); setWidgetTip(m_bender, 0); } void VPiano::slotAbout() { releaseKb(); dlgAbout()->exec(); grabKb(); } void VPiano::slotAboutQt() { releaseKb(); QApplication::aboutQt(); grabKb(); } void VPiano::refreshConnections() { int i = 0, nInPorts = 0, nOutPorts = 0; try { dlgMidiSetup()->clearCombos(); // inputs if (m_midiin == 0) { dlgMidiSetup()->inputNotAvailable(); dlgMidiSetup()->setInputEnabled(false); } else { #if !defined(__LINUX_ALSASEQ__) && !defined(__MACOSX_CORE__) dlgMidiSetup()->setInputEnabled(m_currentIn != -1); #endif dlgMidiSetup()->addInputPortName(QString::null, -1); nInPorts = m_midiin->getPortCount(); for ( i = 0; i < nInPorts; i++ ) { QString name = QString::fromStdString(m_midiin->getPortName(i)); if (!name.startsWith(QSTR_VMPK)) dlgMidiSetup()->addInputPortName(name, i); } } // outputs nOutPorts = m_midiout->getPortCount(); for ( i = 0; i < nOutPorts; i++ ) { QString name = QString::fromStdString(m_midiout->getPortName(i)); if (!name.startsWith(QSTR_VMPK)) dlgMidiSetup()->addOutputPortName(name, i); } } catch (RtError& err) { ui.statusBar->showMessage(QString::fromStdString(err.getMessage())); } } void VPiano::slotConnections() { refreshConnections(); dlgMidiSetup()->setCurrentInput(m_currentIn); dlgMidiSetup()->setCurrentOutput(m_currentOut); releaseKb(); if (dlgMidiSetup()->exec() == QDialog::Accepted) { applyConnections(); } grabKb(); } void VPiano::applyConnections() { int i, nInPorts = 0, nOutPorts = 0; try { nOutPorts = m_midiout->getPortCount(); i = dlgMidiSetup()->selectedOutput(); if ((i >= 0) && (i < nOutPorts) && (i != m_currentOut)) { m_midiout->closePort(); m_midiout->openPort(i); } m_currentOut = i; if (m_midiin != 0) { nInPorts = m_midiin->getPortCount(); i = dlgMidiSetup()->selectedInput(); if (m_inputActive && (i != m_currentIn)) { m_midiin->cancelCallback(); m_inputActive = false; if (m_currentIn > -1) m_midiin->closePort(); } if ((i >= 0) && (i < nInPorts) && (i != m_currentIn) && dlgMidiSetup()->inputIsEnabled()) { m_midiin->openPort(i); m_midiin->setCallback( &midiCallback, this ); m_inputActive = true; } m_currentIn = i; m_midiThru = dlgMidiSetup()->thruIsEnabled(); } } catch (RtError& err) { ui.statusBar->showMessage(QString::fromStdString(err.getMessage())); } } void VPiano::initControllers(int channel) { if (m_ins != 0) { InstrumentData controls = m_ins->control(); InstrumentData::ConstIterator it, end; it = controls.constBegin(); end = controls.constEnd(); for( ; it != end; ++it ) { int ctl = it.key(); switch (ctl) { case CTL_VOLUME: m_ctlState[channel][CTL_VOLUME] = MIDIVOLUME; break; case CTL_PAN: m_ctlState[channel][CTL_PAN] = MIDIPAN; break; case CTL_EXPRESSION: m_ctlState[channel][CTL_EXPRESSION] = MIDIEXPRESSION; break; default: m_ctlState[channel][ctl] = 0; } } } } void VPiano::populateControllers() { m_comboControl->blockSignals(true); m_comboControl->clear(); if (m_ins != 0) { InstrumentData controls = m_ins->control(); InstrumentData::ConstIterator it, end = controls.constEnd(); for( it = controls.constBegin(); it != end; ++it ) m_comboControl->addItem(it.value(), it.key()); } m_comboControl->blockSignals(false); } void VPiano::applyPreferences() { ui.pianokeybd->allKeysOff(); if (ui.pianokeybd->baseOctave() != m_baseOctave) { ui.pianokeybd->setBaseOctave(m_baseOctave); } if (ui.pianokeybd->numOctaves() != dlgPreferences()->getNumOctaves()) { ui.pianokeybd->setNumOctaves(dlgPreferences()->getNumOctaves()); } ui.pianokeybd->setKeyPressedColor(dlgPreferences()->getKeyPressedColor()); ui.pianokeybd->setRawKeyboardMode(dlgPreferences()->getRawKeyboard()); ui.pianokeybd->setVelocity(dlgPreferences()->getVelocityColor() ? m_velocity : MIDIVELOCITY ); #if defined(NETWORK_MIDI) g_iUdpPort = dlgPreferences()->getNetworkPort(); #endif KeyboardMap* map = dlgPreferences()->getKeyboardMap(); if (!map->getFileName().isEmpty() && map->getFileName() != QSTR_DEFAULT ) ui.pianokeybd->setKeyboardMap(map); else ui.pianokeybd->resetKeyboardMap(); map = dlgPreferences()->getRawKeyboardMap(); if (!map->getFileName().isEmpty() && map->getFileName() != QSTR_DEFAULT ) ui.pianokeybd->setRawKeyboardMap(map); else ui.pianokeybd->resetRawKeyboardMap(); populateInstruments(); populateControllers(); QPoint wpos = pos(); Qt::WindowFlags flags = windowFlags(); if (dlgPreferences()->getAlwaysOnTop()) flags |= Qt::WindowStaysOnTopHint; else flags &= ~Qt::WindowStaysOnTopHint; setWindowFlags( flags ); move(wpos); slotShowNoteNames(); updateStyles(); show(); } void VPiano::populateInstruments() { m_ins = 0; m_comboBank->clear(); m_comboProg->clear(); if (!dlgPreferences()->getInstrumentsFileName().isEmpty() && dlgPreferences()->getInstrumentsFileName() != QSTR_DEFAULT) { if (m_channel == dlgPreferences()->getDrumsChannel()) m_ins = dlgPreferences()->getDrumsInstrument(); else m_ins = dlgPreferences()->getInstrument(); if (m_ins != 0) { //qDebug() << "Instrument Name:" << m_ins->instrumentName(); //qDebug() << "Bank Selection method: " << m_ins->bankSelMethod(); InstrumentPatches patches = m_ins->patches(); InstrumentPatches::ConstIterator j; for( j = patches.constBegin(); j != patches.constEnd(); ++j ) { //if (j.key() < 0) continue; InstrumentData patch = j.value(); m_comboBank->addItem(patch.name(), j.key()); //qDebug() << "---- Bank[" << j.key() << "]=" << patch.name(); } updateBankChange(m_lastBank[m_channel]); } } } void VPiano::applyInitialSettings() { int idx, ctl; for ( int ch=0; ch::Iterator i, j, end; i = m_ctlSettings[ch].begin(); end = m_ctlSettings[ch].end(); for (; i != end; ++i) { j = m_ctlState[ch].find(i.key()); if (j != m_ctlState[ch].end()) m_ctlState[ch][i.key()] = i.value(); } } ctl = m_lastCtl[m_channel]; idx = m_comboControl->findData(ctl); if (idx != -1) m_comboControl->setCurrentIndex(idx); //slotControlSliderMoved(m_ctlState[m_channel][ctl]); updateBankChange(m_lastBank[m_channel]); idx = m_comboProg->findData(m_lastProg[m_channel]); m_comboProg->setCurrentIndex(idx); //slotComboProgActivated(idx); } void VPiano::slotPreferences() { #if defined(NETWORK_MIDI) int old_udpPort = g_iUdpPort; #endif releaseKb(); if (dlgPreferences()->exec() == QDialog::Accepted) { applyPreferences(); #if defined(NETWORK_MIDI) if (old_udpPort != g_iUdpPort) { applyConnections(); } #endif } grabKb(); } QString VPiano::dataDirectory() { #if defined(Q_OS_WIN32) return QApplication::applicationDirPath() + "/"; #elif defined(Q_OS_LINUX) return QApplication::applicationDirPath() + "/../share/vmpk/"; #elif defined(Q_OS_DARWIN) return QApplication::applicationDirPath() + "/../Resources/"; #elif defined(Q_OS_SYMBIAN) return QApplication::applicationDirPath() + "/"; #endif return QString(); } QString VPiano::localeDirectory() { #if defined(Q_OS_LINUX) return VPiano::dataDirectory() + "locale/"; #else return VPiano::dataDirectory(); #endif } void VPiano::slotEditKeyboardMap() { #if !defined(SMALL_SCREEN) KeyboardMap* map; releaseKb(); if (dlgPreferences()->getRawKeyboard()) map = ui.pianokeybd->getRawKeyboardMap(); else map = ui.pianokeybd->getKeyboardMap(); dlgKeyMap()->displayMap(map); if (dlgKeyMap()->exec() == QDialog::Accepted) { dlgKeyMap()->getMap(map); if (dlgPreferences()->getRawKeyboard()) ui.pianokeybd->setRawKeyboardMap(map); else ui.pianokeybd->setKeyboardMap(map); } grabKb(); #endif } void VPiano::populatePrograms(int bank) { if (bank < 0) return; m_comboProg->clear(); if (m_ins != 0) { InstrumentData patch = m_ins->patch(bank); InstrumentData::ConstIterator k; for( k = patch.constBegin(); k != patch.constEnd(); ++k ) m_comboProg->addItem(k.value(), k.key()); //qDebug() << "patch[" << k.key() << "]=" << k.value(); } } void VPiano::slotComboBankActivated(const int index) { int idx = index; if (idx < 0) m_comboBank->setCurrentIndex(idx = 0); int bank = m_comboBank->itemData(idx).toInt(); populatePrograms(bank); slotComboProgActivated(); } void VPiano::slotComboProgActivated(const int index) { int idx = index; if (idx < 0) m_comboProg->setCurrentIndex(idx = 0); int bankIdx = m_comboBank->currentIndex(); int bank = m_comboBank->itemData(bankIdx).toInt(); if (bank >= 0) { sendBankChange(bank); m_lastBank[m_channel] = bank; } int pgm = m_comboProg->itemData(idx).toInt(); if (pgm >= 0) { sendProgramChange(pgm); m_lastProg[m_channel] = pgm; } updateNoteNames(m_channel == dlgPreferences()->getDrumsChannel()); } void VPiano::slotBaseOctaveValueChanged(const int octave) { if (octave != m_baseOctave) { ui.pianokeybd->allKeysOff(); ui.pianokeybd->setBaseOctave(octave); m_baseOctave = octave; } } void VPiano::slotTransposeValueChanged(const int transpose) { if (transpose != m_transpose) { ui.pianokeybd->setTranspose(transpose); m_transpose = transpose; } } void VPiano::updateNoteNames(bool drums) { if (drums && (m_ins != 0)) { int b = m_lastBank[m_channel]; int p = m_lastProg[m_channel]; const InstrumentData& notes = m_ins->notes(b, p); QStringList noteNames; for(int n=0; n<128; ++n) { if (notes.contains(n)) noteNames << notes[n]; else noteNames << QString(); } ui.pianokeybd->useCustomNoteNames(noteNames); } else ui.pianokeybd->useStandardNoteNames(); } void VPiano::slotChannelValueChanged(const int channel) { int idx; int c = channel - 1; if (c != m_channel) { int drms = dlgPreferences()->getDrumsChannel(); bool updDrums = ((c == drms) || (m_channel == drms)); m_channel = c; if (updDrums) { populateInstruments(); populateControllers(); } idx = m_comboControl->findData(m_lastCtl[m_channel]); if (idx != -1) { int ctl = m_lastCtl[m_channel]; m_comboControl->setCurrentIndex(idx); updateController(ctl, m_ctlState[m_channel][ctl]); updateExtraController(ctl, m_ctlState[m_channel][ctl]); } updateBankChange(m_lastBank[m_channel]); updateProgramChange(m_lastProg[m_channel]); } } void VPiano::updateController(int ctl, int val) { int index = m_comboControl->currentIndex(); int controller = m_comboControl->itemData(index).toInt(); if (controller == ctl) { m_Control->setValue(val); m_Control->setToolTip(QString::number(val)); } m_ctlState[m_channel][ctl] = val; if ((ctl == CTL_MSB || ctl == CTL_LSB ) && m_ins != 0) { if (m_ins->bankSelMethod() == 0) m_lastBank[m_channel] = m_ctlState[m_channel][CTL_MSB] << 7 | m_ctlState[m_channel][CTL_LSB]; else m_lastBank[m_channel] = val; updateBankChange(m_lastBank[m_channel]); } } void VPiano::updateExtraController(int ctl, int val) { QList allWidgets = ui.toolBarExtra->findChildren(); foreach(QWidget *w, allWidgets) { QVariant p = w->property(MIDICTLNUMBER); if (p.isValid() && p.toInt() == ctl) { QVariant v = w->property("value"); if (v.isValid() && v.toInt() != val) { w->setProperty("value", val); w->setToolTip(QString::number(val)); continue; } v = w->property("checked"); if (v.isValid()) { QVariant on = w->property(MIDICTLONVALUE); bool checked = (val >= on.toInt()); w->setProperty("checked", checked); } } } } void VPiano::updateBankChange(int bank) { int idx; if (bank < 0) { m_comboBank->setCurrentIndex(idx = 0); bank = m_comboBank->itemData(idx).toInt(); if (bank < 0) bank = 0; } else { idx = m_comboBank->findData(bank); if (idx != -1) { m_comboBank->setCurrentIndex(idx); m_lastBank[m_channel] = bank; } } populatePrograms(bank); updateProgramChange(); } void VPiano::updateProgramChange(int program) { int idx; if (program < 0) { m_comboProg->setCurrentIndex(idx = 0); program = m_comboProg->itemData(idx).toInt(); } else { idx = m_comboProg->findData(program); if (idx != -1) { m_comboProg->setCurrentIndex(idx); m_lastProg[m_channel] = program; } } updateNoteNames(m_channel == dlgPreferences()->getDrumsChannel()); } void VPiano::slotComboControlCurrentIndexChanged(const int index) { int ctl = m_comboControl->itemData(index).toInt(); int val = m_ctlState[m_channel][ctl]; m_Control->setValue(val); m_Control->setToolTip(QString::number(val)); m_lastCtl[m_channel] = ctl; //slotControlSliderMoved(val); } void VPiano::grabKb() { #if !defined(SMALL_SCREEN) if (dlgPreferences()->getGrabKeyboard()) { ui.pianokeybd->grabKeyboard(); } ui.pianokeybd->setRawKeyboardMode(dlgPreferences()->getRawKeyboard()); #endif } void VPiano::releaseKb() { #if !defined(SMALL_SCREEN) if (dlgPreferences()->getGrabKeyboard()) { ui.pianokeybd->releaseKeyboard(); } ui.pianokeybd->setRawKeyboardMode(false); #endif } class HelpDialog : public QDialog { public: HelpDialog(const QUrl &document, QWidget *parent = 0) : QDialog(parent) { setWindowState(Qt::WindowMaximized | Qt::WindowActive); QVBoxLayout *layout = new QVBoxLayout(this); QTextBrowser *browser = new QTextBrowser(this); layout->addWidget(browser); QDialogButtonBox *buttonBox = new QDialogButtonBox(this); buttonBox->setOrientation(Qt::Horizontal); buttonBox->setStandardButtons(QDialogButtonBox::Ok); layout->addWidget(buttonBox); browser->setSource(document); connect(buttonBox, SIGNAL(accepted()), SLOT(close())); } }; void VPiano::slotHelpContents() { QStringList hlps; QLocale loc(configuredLanguage()); QStringList lc = loc.name().split("_"); hlps += QSTR_HELPL.arg(loc.name()); if (lc.count() > 1) hlps += QSTR_HELPL.arg(lc[0]); hlps += QSTR_HELP; QDir hlpDir(VPiano::dataDirectory()); foreach(const QString& hlp_name, hlps) { if (hlpDir.exists(hlp_name)) { QUrl url = QUrl::fromLocalFile(hlpDir.absoluteFilePath(hlp_name)); #if defined(SMALL_SCREEN) HelpDialog hlpDlg(url, this); hlpDlg.exec(); #else QDesktopServices::openUrl(url); #endif return; } } QMessageBox::critical(this, tr("Error"), tr("No help file found")); } void VPiano::slotOpenWebSite() { QUrl url(QSTR_VMPKURL); QDesktopServices::openUrl(url); } void VPiano::updateStyles() { QList allKnobs = findChildren (); foreach(Knob* knob, allKnobs) { knob->setStyle(dlgPreferences()->getStyledWidgets() ? m_dialStyle : 0); } QList allChkbox = ui.toolBarExtra->findChildren (); foreach(QCheckBox* chkbox, allChkbox) { chkbox->setStyle(dlgPreferences()->getStyledWidgets() ? m_dialStyle : 0); } } void VPiano::slotImportSF() { releaseKb(); if ((dlgRiffImport()->exec() == QDialog::Accepted) && !dlgRiffImport()->getOutput().isEmpty()) { dlgRiffImport()->save(); dlgPreferences()->setInstrumentsFileName(dlgRiffImport()->getOutput()); dlgPreferences()->setInstrumentName(dlgRiffImport()->getName()); applyPreferences(); } grabKb(); } void VPiano::slotEditExtraControls() { dlgExtra()->setControls(m_extraControls); releaseKb(); if (dlgExtra()->exec() == QDialog::Accepted) { m_extraControls = dlgExtra()->getControls(); clearExtraControllers(); initExtraControllers(); } grabKb(); } About* VPiano::dlgAbout() { if (m_dlgAbout == 0) { m_dlgAbout = new About(this); } return m_dlgAbout; } Preferences* VPiano::dlgPreferences() { if (m_dlgPreferences == 0) { m_dlgPreferences = new Preferences(this); } return m_dlgPreferences; } MidiSetup* VPiano::dlgMidiSetup() { if (m_dlgMidiSetup == 0) { m_dlgMidiSetup = new MidiSetup(this); } return m_dlgMidiSetup; } KMapDialog* VPiano::dlgKeyMap() { #if !defined(SMALL_SCREEN) if (m_dlgKeyMap == 0) { m_dlgKeyMap = new KMapDialog(this); } #endif return m_dlgKeyMap; } DialogExtraControls* VPiano::dlgExtra() { if (m_dlgExtra == 0) { m_dlgExtra = new DialogExtraControls(this); } return m_dlgExtra; } RiffImportDlg* VPiano::dlgRiffImport() { if (m_dlgRiffImport == 0) { m_dlgRiffImport = new RiffImportDlg(this); } return m_dlgRiffImport; } void VPiano::setWidgetTip(QWidget* w, int val) { QString tip = QString::number(val); w->setToolTip(tip); QToolTip::showText(w->parentWidget()->mapToGlobal(w->pos()), tip); } void VPiano::slotShowNoteNames() { ui.pianokeybd->setShowLabels(ui.actionNoteNames->isChecked()); } //void VPiano::slotEditPrograms() //{ } #if ENABLE_DBUS void VPiano::quit() { close(); } void VPiano::panic() { allNotesOff(); } void VPiano::reset_controllers() { resetAllControllers(); } void VPiano::channel(int value) { if (value >= 0 && value < MIDICHANNELS) m_sboxChannel->setValue(value + 1); } void VPiano::octave(int value) { m_sboxOctave->setValue(value); } void VPiano::transpose(int value) { m_sboxTranspose->setValue(value); } void VPiano::velocity(int value) { m_Velocity->setValue(value); } void VPiano::connect_in(const QString &value) { if( m_midiin != 0) { dlgMidiSetup()->setInputEnabled(true); dlgMidiSetup()->setCurrentInput(value); applyConnections(); } } void VPiano::connect_out(const QString &value) { if( m_midiout != 0) { dlgMidiSetup()->setCurrentOutput(value); applyConnections(); } } void VPiano::connect_thru(bool value) { if( m_midiin != 0 && m_midiout != 0) { dlgMidiSetup()->setThruEnabled(value); applyConnections(); } } void VPiano::noteoff(int note) { sendNoteOff(note, 0); NoteOffEvent *ev = new NoteOffEvent(note, 0); QApplication::postEvent(this, ev); } void VPiano::noteon(int note) { sendNoteOn(note, m_velocity); NoteOnEvent *ev = new NoteOnEvent(note, m_velocity); QApplication::postEvent(this, ev); } void VPiano::polykeypress(int note, int value) { sendPolyKeyPress(note, value); PolyKeyPressEvent *ev = new PolyKeyPressEvent(note, value); QApplication::postEvent(this, ev); } void VPiano::controlchange(int control, int value) { sendController(control, value); ControlChangeEvent *ev = new ControlChangeEvent(control, value); QApplication::postEvent(this, ev); } void VPiano::programchange(int value) { sendProgramChange(value); ProgramChangeEvent *ev = new ProgramChangeEvent(value); QApplication::postEvent(this, ev); } void VPiano::programnamechange(const QString &value) { int idx = m_comboProg->findText(value, Qt::MatchFixedString); if (idx != -1) { int prg = m_comboProg->itemData(idx).toInt(); programchange(prg); } } void VPiano::chankeypress(int value) { sendChanKeyPress(value); ChannelKeyPressEvent *ev = new ChannelKeyPressEvent(value); QApplication::postEvent(this, ev); } void VPiano::pitchwheel(int value) { sendBender(value); PitchWheelEvent *ev = new PitchWheelEvent(value); QApplication::postEvent(this, ev); } #endif /* ENABLE_DBUS */ void VPiano::slotShortcuts() { #if !defined(SMALL_SCREEN) ShortcutDialog shcutDlg(findChildren()); releaseKb(); shcutDlg.exec(); grabKb(); #endif } void VPiano::slotBankNext() { int index = m_comboBank->currentIndex(); if (index < m_comboBank->count()-1) { m_comboBank->setCurrentIndex(++index); slotComboBankActivated(index); } } void VPiano::slotBankPrev() { int index = m_comboBank->currentIndex(); if (index > 0) { m_comboBank->setCurrentIndex(--index); slotComboBankActivated(index); } } void VPiano::slotProgramNext() { int index = m_comboProg->currentIndex(); if (index < m_comboProg->count()-1) { m_comboProg->setCurrentIndex(++index); slotComboProgActivated(index); } } void VPiano::slotProgramPrev() { int index = m_comboProg->currentIndex(); if (index > 0) { m_comboProg->setCurrentIndex(--index); slotComboProgActivated(index); } } void VPiano::slotControllerNext() { int index = m_comboControl->currentIndex(); if (index < m_comboControl->count()-1) m_comboControl->setCurrentIndex(++index); } void VPiano::slotControllerPrev() { int index = m_comboControl->currentIndex(); if (index > 0) m_comboControl->setCurrentIndex(--index); } void VPiano::slotVelocityUp() { m_Velocity->triggerAction(Knob::SliderPageStepAdd); } void VPiano::slotVelocityDown() { m_Velocity->triggerAction(Knob::SliderPageStepSub); } void VPiano::slotControllerUp() { m_Control->triggerAction(Knob::SliderPageStepAdd); slotControlSliderMoved(m_Control->value()); } void VPiano::slotControllerDown() { m_Control->triggerAction(Knob::SliderPageStepSub); slotControlSliderMoved(m_Control->value()); } QString VPiano::configuredLanguage() { if (m_language.isEmpty()) { QSettings settings; QString defLang = QLocale::system().name(); settings.beginGroup(QSTR_PREFERENCES); m_language = settings.value(QSTR_LANGUAGE, defLang).toString(); settings.endGroup(); //qDebug() << Q_FUNC_INFO << m_language; } return m_language; } void VPiano::slotSwitchLanguage(QAction *action) { QString lang = action->data().toString(); if ( QMessageBox::question (this, tr("Language Changed"), tr("The language for this application is going to change to %1. " "Do you want to continue?").arg(m_supportedLangs[lang]), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes ) { m_language = lang; retranslateUi(); } else { m_currentLang->setChecked(true); } } void VPiano::createLanguageMenu() { QString currentLang = configuredLanguage(); QActionGroup *languageGroup = new QActionGroup(this); connect(languageGroup, SIGNAL(triggered(QAction *)), SLOT(slotSwitchLanguage(QAction *))); QDir dir(VPiano::localeDirectory()); QStringList fileNames = dir.entryList(QStringList(QSTR_VMPKPX + "*.qm")); QStringList locales; locales << "en"; foreach (const QString& fileName, fileNames) { QString locale = fileName; locale.remove(0, locale.indexOf('_') + 1); locale.truncate(locale.lastIndexOf('.')); locales << locale; } locales.sort(); foreach (const QString& loc, locales) { QAction *action = new QAction(m_supportedLangs.value(loc), this); action->setCheckable(true); action->setData(loc); ui.menuLanguage->addAction(action); languageGroup->addAction(action); if (currentLang.startsWith(loc)) { action->setChecked(true); m_currentLang = action; } } } void VPiano::slotAboutTranslation() { QString common = tr("

VMPK is developed and translated thanks to the " "volunteer work of many people from around the world. If you want to " "join the team or have any question, please visit the forums at " "SourceForge" "

"); QString currentLang = configuredLanguage(); bool supported(false); if (!currentLang.startsWith("en")) { QMapIterator it(m_supportedLangs); while (it.hasNext()) { it.next(); if (currentLang.startsWith(it.key())) { supported = true; break; } } } if (supported) QMessageBox::information(this, tr("Translation"), tr("

Translation by TRANSLATOR_NAME_AND_EMAIL

%1").arg(common)); else QMessageBox::information(this, tr("Translation Information"), common); } void VPiano::retranslateUi() { m_trq->load( QSTR_QTPX + configuredLanguage(), QLibraryInfo::location(QLibraryInfo::TranslationsPath) ); m_trp->load( QSTR_VMPKPX + configuredLanguage(), VPiano::localeDirectory() ); ui.retranslateUi(this); ui.pianokeybd->retranslate(); initLanguages(); ui.menuLanguage->clear(); createLanguageMenu(); retranslateToolbars(); if (m_dlgAbout != 0) m_dlgAbout->retranslateUi(); if (m_dlgPreferences != 0) m_dlgPreferences->retranslateUi(); if (m_dlgMidiSetup != 0) m_dlgMidiSetup->retranslateUi(); #if !defined(SMALL_SCREEN) if (m_dlgKeyMap != 0) m_dlgKeyMap->retranslateUi(); #endif if (m_dlgExtra != 0) m_dlgExtra->retranslateUi(); if (m_dlgRiffImport != 0) m_dlgRiffImport->retranslateUi(); } void VPiano::initLanguages() { m_supportedLangs.clear(); m_supportedLangs.insert(QLatin1String("cs"), tr("Czech")); m_supportedLangs.insert(QLatin1String("de"), tr("German")); m_supportedLangs.insert(QLatin1String("en"), tr("English")); m_supportedLangs.insert(QLatin1String("es"), tr("Spanish")); m_supportedLangs.insert(QLatin1String("fr"), tr("French")); m_supportedLangs.insert(QLatin1String("nl"), tr("Dutch")); m_supportedLangs.insert(QLatin1String("ru"), tr("Russian")); m_supportedLangs.insert(QLatin1String("sv"), tr("Swedish")); m_supportedLangs.insert(QLatin1String("zh_CN"), tr("Chinese")); } void VPiano::retranslateToolbars() { m_lblChannel->setText( #if defined(SMALL_SCREEN) tr("Chan:") #else tr("Channel:") #endif ); m_lblBaseOctave->setText( #if defined(SMALL_SCREEN) tr("Oct:") #else tr("Base Octave:") #endif ); m_lblTranspose->setText( #if defined(SMALL_SCREEN) tr("Trans:") #else tr("Transpose:") #endif ); m_lblVelocity->setText( #if defined(SMALL_SCREEN) tr("Vel:") #else tr("Velocity:") #endif ); m_lblBank->setText(tr("Bank:")); m_lblBender->setText(tr("Bender:")); m_lblControl->setText(tr("Control:")); m_lblProgram->setText(tr("Program:")); m_lblValue->setText(tr("Value:")); } QMenu * VPiano::createPopupMenu () { #if defined(SMALL_SCREEN) return 0; #else return QMainWindow::createPopupMenu(); #endif } vmpk-0.4.0/src/keyboardmap.cpp0000644000175000001440000001125611572642326015326 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "keyboardmap.h" #include #include #include #include #include void KeyboardMap::loadFromXMLFile(const QString fileName) { QFile f(fileName); if (f.open(QFile::ReadOnly | QFile::Text)) { initializeFromXML(&f); f.close(); m_fileName = fileName; //qDebug() << "Loaded Map: " << fileName; } if (f.error() != QFile::NoError) { reportError(fileName, tr("Error loading a file"), f.errorString()); } } void KeyboardMap::saveToXMLFile(const QString fileName) { QFile f(fileName); if (f.open(QFile::WriteOnly | QFile::Text)) { serializeToXML(&f); f.close(); m_fileName = fileName; //qDebug() << "Saved Map: " << fileName; } if (f.error() != QFile::NoError) { reportError(fileName, tr("Error saving a file"), f.errorString()); } } void KeyboardMap::initializeFromXML(QIODevice *dev) { QXmlStreamReader reader(dev); clear(); while (!reader.atEnd()) { reader.readNext(); if (reader.isStartElement()) { if (reader.name() == (m_rawMode?"rawkeymap":"keyboardmap")) { reader.readNext(); while (reader.isWhitespace()) reader.readNext(); while (reader.isStartElement()) { if (reader.name() == "mapping") { QString key = reader.attributes().value(m_rawMode?"keycode":"key").toString(); QString sn = reader.attributes().value("note").toString(); bool ok = false; int note = sn.toInt(&ok); if (ok) { if (m_rawMode) { int keycode = key.toInt(&ok); if (ok) insert(keycode, note); } else { QKeySequence ks(key); insert(ks[0], note); } } } reader.readNext(); while (reader.isWhitespace() || reader.isEndElement()) reader.readNext(); } } else { reader.readNext(); } } } if (reader.hasError()) { reportError(QString(), tr("Error reading XML"), reader.errorString() ); } } void KeyboardMap::serializeToXML(QIODevice *dev) { QXmlStreamWriter writer(dev); writer.setAutoFormatting(true); //writer.setCodec("UTF-8"); writer.writeStartDocument(); writer.writeDTD(m_rawMode?"":""); writer.writeStartElement(m_rawMode ? "rawkeymap" : "keyboardmap"); writer.writeAttribute("version", "1.0"); foreach(int key, keys()) { writer.writeEmptyElement("mapping"); if (m_rawMode) writer.writeAttribute("keycode", QString::number(key)); else { QKeySequence ks(key); writer.writeAttribute("key", ks.toString(QKeySequence::PortableText)); } writer.writeAttribute("note", QString::number(value(key))); } writer.writeEndElement(); writer.writeEndDocument(); } void KeyboardMap::copyFrom(const KeyboardMap* other) { m_fileName = other->getFileName(); m_rawMode = other->getRawMode(); clear(); KeyboardMap::ConstIterator it; for(it = other->begin(); it != other->end(); ++it) insert(it.key(), it.value()); } void KeyboardMap::reportError( const QString filename, const QString title, const QString err ) { QMessageBox::warning(0, title, tr("File: %1\n%2").arg(filename).arg(err)); } vmpk-0.4.0/src/preferences.cpp0000644000175000001440000002155411572642326015333 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "preferences.h" #include "constants.h" #include "vpiano.h" #include #include #include #include #include Preferences::Preferences(QWidget *parent) : QDialog(parent), m_numOctaves(DEFAULTNUMBEROFOCTAVES), m_drumsChannel(MIDIGMDRUMSCHANNEL), m_networkPort(NETWORKPORTNUMBER), m_grabKb(false), m_styledKnobs(true), m_alwaysOnTop(false), m_rawKeyboard(false), m_velocityColor(true) { ui.setupUi( this ); ui.txtFileInstrument->setText(QSTR_DEFAULT); ui.txtFileKmap->setText(QSTR_DEFAULT); ui.txtFileRawKmap->setText(QSTR_DEFAULT); m_keymap.setRawMode(false); m_rawmap.setRawMode(true); restoreDefaults(); connect(ui.btnInstrument, SIGNAL(clicked()), SLOT(slotOpenInstrumentFile())); connect(ui.btnColor, SIGNAL(clicked()), SLOT(slotSelectColor())); connect(ui.btnKmap, SIGNAL(clicked()), SLOT(slotOpenKeymapFile())); connect(ui.btnRawKmap, SIGNAL(clicked()), SLOT(slotOpenRawKeymapFile())); QPushButton *btnDefaults = ui.buttonBox->button(QDialogButtonBox::RestoreDefaults); connect(btnDefaults, SIGNAL(clicked()), SLOT(slotRestoreDefaults())); #if !defined(RAWKBD_SUPPORT) ui.chkRawKeyboard->setVisible(false); ui.lblRawKmap->setVisible(false); ui.txtFileRawKmap->setVisible(false); ui.btnRawKmap->setVisible(false); #endif #if !defined(NETWORK_MIDI) ui.lblNetworkPort->setVisible(false); ui.txtNetworkPort->setVisible(false); #endif #if defined(SMALL_SCREEN) ui.chkRawKeyboard->setVisible(false); ui.lblRawKmap->setVisible(false); ui.txtFileRawKmap->setVisible(false); ui.btnRawKmap->setVisible(false); ui.lblKmap->setVisible(false); ui.txtFileKmap->setVisible(false); ui.btnKmap->setVisible(false); ui.chkAlwaysOnTop->setVisible(false); ui.chkGrabKb->setVisible(false); setWindowState(Qt::WindowActive | Qt::WindowMaximized); #else setMinimumSize(480,320); adjustSize(); #endif } void Preferences::showEvent ( QShowEvent *event ) { if (event->type() == QEvent::Show) { ui.spinNumOctaves->setValue( m_numOctaves ); ui.cboDrumsChannel->setCurrentIndex(m_drumsChannel+1); ui.chkGrabKb->setChecked( m_grabKb ); ui.chkStyledKnobs->setChecked( m_styledKnobs ); ui.chkAlwaysOnTop->setChecked( m_alwaysOnTop ); ui.chkRawKeyboard->setChecked( m_rawKeyboard ); ui.chkVelocityColor->setChecked( m_velocityColor ); ui.txtNetworkPort->setText( QString::number( m_networkPort )); if (!m_keyPressedColor.isValid()) { setKeyPressedColor(QApplication::palette().highlight().color()); } } } void Preferences::apply() { m_numOctaves = ui.spinNumOctaves->value(); m_keyPressedColor = QColor(ui.lblColorName->text()); m_grabKb = ui.chkGrabKb->isChecked(); m_styledKnobs = ui.chkStyledKnobs->isChecked(); m_alwaysOnTop = ui.chkAlwaysOnTop->isChecked(); m_rawKeyboard = ui.chkRawKeyboard->isChecked(); m_velocityColor = ui.chkVelocityColor->isChecked(); if ( ui.txtFileRawKmap->text().isEmpty() || ui.txtFileRawKmap->text() == QSTR_DEFAULT) m_rawmap.setFileName(QSTR_DEFAULT); if ( ui.txtFileKmap->text().isEmpty() || ui.txtFileKmap->text() == QSTR_DEFAULT) m_keymap.setFileName(QSTR_DEFAULT); if ( ui.txtFileInstrument->text().isEmpty() || ui.txtFileInstrument->text() == QSTR_DEFAULT ) m_insFileName = QSTR_DEFAULT; m_drumsChannel = ui.cboDrumsChannel->currentIndex() - 1; m_networkPort = ui.txtNetworkPort->text().toInt(); } void Preferences::accept() { apply(); QDialog::accept(); } void Preferences::slotOpenInstrumentFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open instruments definition"), VPiano::dataDirectory(), tr("Instrument definitions (*.ins)")); if (!fileName.isEmpty()) { setInstrumentsFileName(fileName); } } void Preferences::slotSelectColor() { QColor color = QColorDialog::getColor(m_keyPressedColor, this); setKeyPressedColor(color); } Instrument* Preferences::getInstrument() { QString key = ui.cboInstrument->currentText(); if (key.isEmpty()) return NULL; if (!m_ins.contains(key)) return NULL; return &m_ins[key]; } Instrument* Preferences::getDrumsInstrument() { QString key = ui.cboInstrument->currentText(); if (key.isEmpty()) return NULL; key.append(" Drums"); if (!m_ins.contains(key)) return NULL; return &m_ins[key]; } void Preferences::setInstrumentsFileName( const QString fileName ) { QFileInfo f(fileName); if (f.isReadable()) { m_ins.clear(); ui.cboInstrument->clear(); if (m_ins.load(fileName)) { ui.txtFileInstrument->setText(f.fileName()); InstrumentList::ConstIterator it; for(it = m_ins.constBegin(); it != m_ins.constEnd(); ++it) { if(!it.key().endsWith(QLatin1String("Drums"), Qt::CaseInsensitive)) ui.cboInstrument->addItem(it.key()); } ui.cboInstrument->setCurrentIndex(-1); m_insFileName = fileName; } else { m_insFileName.clear(); ui.txtFileInstrument->setText(m_insFileName); } } else { qDebug() << "file" << fileName << "not readable."; } } QString Preferences::getInstrumentsFileName() { return m_insFileName; } void Preferences::setInstrumentName( const QString name ) { int index = ui.cboInstrument->findText( name ); ui.cboInstrument->setCurrentIndex( index ); } QString Preferences::getInstrumentName() { return ui.cboInstrument->currentText(); } void Preferences::setKeyPressedColor(QColor value) { if (m_keyPressedColor != value && value.isValid()) { m_keyPressedColor = value; ui.lblColorName->setText(value.name()); ui.lblColorName->setPalette(QPalette(value)); ui.lblColorName->setAutoFillBackground(true); } } void Preferences::slotOpenKeymapFile() { QString fileName = QFileDialog::getOpenFileName(0, tr("Open keyboard map definition"), VPiano::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { setKeyMapFileName(fileName); } } void Preferences::slotOpenRawKeymapFile() { QString fileName = QFileDialog::getOpenFileName(0, tr("Open keyboard map definition"), VPiano::dataDirectory(), tr("Keyboard map (*.xml)")); if (!fileName.isEmpty()) { setRawKeyMapFileName(fileName); } } void Preferences::setRawKeyMapFileName( const QString fileName ) { QFileInfo f(fileName); if (f.isReadable()) { m_rawmap.loadFromXMLFile(fileName); ui.txtFileRawKmap->setText(f.fileName()); } else { m_rawmap.clear(); m_rawmap.setFileName(QSTR_DEFAULT); } } void Preferences::setKeyMapFileName( const QString fileName ) { QFileInfo f(fileName); if (f.isReadable()) { m_keymap.loadFromXMLFile(fileName); ui.txtFileKmap->setText(f.fileName()); } else { m_keymap.clear(); m_keymap.setFileName(QSTR_DEFAULT); } } void Preferences::restoreDefaults() { ui.chkAlwaysOnTop->setChecked(false); ui.chkGrabKb->setChecked(false); ui.chkRawKeyboard->setChecked(false); ui.chkStyledKnobs->setChecked(true); ui.spinNumOctaves->setValue(DEFAULTNUMBEROFOCTAVES); ui.txtFileKmap->setText(QSTR_DEFAULT); ui.txtFileRawKmap->setText(QSTR_DEFAULT); ui.chkVelocityColor->setChecked(true); setInstrumentsFileName(VPiano::dataDirectory() + QSTR_DEFAULTINS); ui.cboInstrument->setCurrentIndex(0); ui.txtNetworkPort->setText(QString::number(NETWORKPORTNUMBER)); } void Preferences::slotRestoreDefaults() { restoreDefaults(); setKeyPressedColor(QApplication::palette().highlight().color()); } void Preferences::retranslateUi() { ui.retranslateUi(this); } vmpk-0.4.0/src/instrument.h0000644000175000001440000002227211572642326014705 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. See http://qtractor.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ /* Library of compatible instrument definitions: ftp://ftp.cakewalk.com/pub/InstrumentDefinitions/ */ #ifndef __instrument_h #define __instrument_h #include #include // Forward declarations. class QTextStream; //---------------------------------------------------------------------- // class InstrumentData -- instrument definition data classes. // class InstrumentData { public: typedef QMap DataMap; // Constructor. InstrumentData() : m_pData(new DataRef()) {} // Copy constructor. InstrumentData(const InstrumentData& data) { attach(data); } // Destructor. ~InstrumentData() { detach(); } // Assignment operator. InstrumentData& operator= (const InstrumentData& data) { if (m_pData != data.m_pData) { detach(); attach(data); } return *this; } // Accessor operator. QString& operator[] (int iIndex) const { return m_pData->map[iIndex]; } // Property accessors. void setName(const QString& sName) { m_pData->name = sName; } const QString& name() const { return m_pData->name; } void setBasedOn(const QString& sBasedOn) { m_pData->basedOn = sBasedOn; } const QString& basedOn() const { return m_pData->basedOn; } // Indirect iterator stuff. typedef DataMap::Iterator Iterator; Iterator begin() { return m_pData->map.begin(); } Iterator end() { return m_pData->map.end(); } typedef DataMap::ConstIterator ConstIterator; ConstIterator constBegin() const { return m_pData->map.constBegin(); } ConstIterator constEnd() const { return m_pData->map.constEnd(); } unsigned int count() const { return m_pData->map.count(); } bool contains(int iKey) const { return m_pData->map.contains(iKey); } protected: // Copy/clone method. void attach(const InstrumentData& data) { m_pData = data.m_pData; m_pData->refCount++; } // Destroy method. void detach() { if (--(m_pData->refCount) == 0) delete m_pData; } private: // The ref-counted data. struct DataRef { // Default payload constructor. DataRef() : refCount(1) {}; // Payload members. int refCount; QString name; QString basedOn; DataMap map; } * m_pData; }; class InstrumentDataList : public QMap {}; class InstrumentPatches : public QMap {}; class InstrumentNotes : public QMap {}; class InstrumentKeys : public QMap {}; class InstrumentDrumFlags : public QMap {}; class InstrumentDrums : public QMap {}; //---------------------------------------------------------------------- // class Instrument -- instrument definition instance class. // class Instrument { public: // Constructor. Instrument() : m_pData(new DataRef()) {} // Copy constructor. Instrument(const Instrument& instr) { attach(instr); } // Destructor. ~Instrument() { detach(); } // Assignment operator. Instrument& operator= (const Instrument& instr) { if (m_pData != instr.m_pData) { detach(); attach(instr); } return *this; } // Instrument title property accessors. void setInstrumentName(const QString& sInstrumentName) { m_pData->instrumentName = sInstrumentName; } const QString& instrumentName() const { return m_pData->instrumentName; } // BankSelMethod accessors. void setBankSelMethod(int iBankSelMethod) { m_pData->bankSelMethod = iBankSelMethod; } int bankSelMethod() const { return m_pData->bankSelMethod; } void setUsesNotesAsControllers(bool bUsesNotesAsControllers) { m_pData->usesNotesAsControllers = bUsesNotesAsControllers; } bool usesNotesAsControllers() const { return m_pData->usesNotesAsControllers; } // Patch banks accessors. const InstrumentPatches& patches() const { return m_pData->patches; } const InstrumentData& patch(int iBank) const; void setPatch(int iBank, const InstrumentData& patch) { m_pData->patches[iBank] = patch; } // Control names accessors. void setControlName(const QString& sControlName) { m_pData->control.setName(sControlName); } const QString& controlName() const { return m_pData->control.name(); } void setControl(const InstrumentData& control) { m_pData->control = control; } const InstrumentData& control() const { return m_pData->control; } // RPN names accessors. void setRpnName(const QString& sRpnName) { m_pData->rpn.setName(sRpnName); } const QString& rpnName() const { return m_pData->rpn.name(); } void setRpn(const InstrumentData& rpn) { m_pData->rpn = rpn; } const InstrumentData& rpn() const { return m_pData->rpn; } // NRPN names accessors. void setNrpnName(const QString& sNrpnName) { m_pData->nrpn.setName(sNrpnName); } const QString& nrpnName() const { return m_pData->nrpn.name(); } void setNrpn(const InstrumentData& nrpn) { m_pData->nrpn = nrpn; } const InstrumentData& nrpn() const { return m_pData->nrpn; } // Keys banks accessors. const InstrumentData& notes(int iBank, int iProg) const; void setNotes(int iBank, int iProg, const InstrumentData& notes) { m_pData->keys[iBank][iProg] = notes; } const InstrumentKeys& keys() const { return m_pData->keys; } // Drumflags banks accessors. bool isDrum(int iBank, int iProg) const; void setDrum(int iBank, int iProg, bool bDrum) { m_pData->drums[iBank][iProg] = (int) bDrum; } const InstrumentDrums& drums() const { return m_pData->drums; } protected: // Copy/clone method. void attach(const Instrument& instr) { m_pData = instr.m_pData; m_pData->refCount++; } // Destroy method. void detach() { if (--(m_pData->refCount) == 0) delete m_pData; } private: // The ref-counted data. struct DataRef { // Default payload constructor. DataRef() : refCount(1), bankSelMethod(0), usesNotesAsControllers(false) {}; // Payload members. int refCount; int bankSelMethod; bool usesNotesAsControllers; QString instrumentName; InstrumentPatches patches; InstrumentData control; InstrumentData rpn; InstrumentData nrpn; InstrumentKeys keys; InstrumentDrums drums; } * m_pData; }; //---------------------------------------------------------------------- // class InstrumentList -- A Cakewalk .ins file container class. // class InstrumentList : public QMap { public: // Open file methods. bool load(const QString& sFilename); bool save(const QString& sFilename); // The official loaded file list. const QStringList& files() const; // Manage a file list (out of sync) void appendFile(const QString& sFilename) { m_files.append(sFilename); } void removeFile(const QString& sFilename) { int iFile = m_files.indexOf(sFilename); if (iFile >= 0) m_files.removeAt(iFile); } // Patch Names definition accessors. const InstrumentDataList& patches() const { return m_patches; } const InstrumentData& patch(const QString& sName) { return m_patches[sName]; } // Note Names definition accessors. const InstrumentDataList& notes() const { return m_notes; } InstrumentData& note(const QString& sName) { return m_notes[sName]; } // Controller Names definition accessors. const InstrumentDataList& controllers() const { return m_controllers; } InstrumentData& controller(const QString& sName) { return m_controllers[sName]; } // RPN Names definition accessors. const InstrumentDataList& rpns() const { return m_rpns; } InstrumentData& rpn(const QString& sName) { return m_rpns[sName]; } // NRPN Names definition accessors. const InstrumentDataList& nrpns() const { return m_nrpns; } InstrumentData& nrpn(const QString& sName) { return m_nrpns[sName]; } // Clear all contents. void clearAll(); // Special instrument list merge method. void merge(const InstrumentList& instruments); protected: // Internal instrument data list save method helpers. void saveDataList(QTextStream& ts, const InstrumentDataList& list); void saveData(QTextStream& ts, const InstrumentData& data); // Special instrument data list merge method. void mergeDataList(InstrumentDataList& dst, const InstrumentDataList& src); private: // To hold the names definition lists. InstrumentDataList m_patches; InstrumentDataList m_notes; InstrumentDataList m_controllers; InstrumentDataList m_rpns; InstrumentDataList m_nrpns; // To old the official file list. QStringList m_files; }; #endif // __instrument_h vmpk-0.4.0/src/events.h0000644000175000001440000000705111572642326013777 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef EVENTS_H #define EVENTS_H #include "mididefs.h" #include const QEvent::Type NoteOffEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_NOTEOFF ) ); const QEvent::Type NoteOnEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_NOTEON ) ); const QEvent::Type PolyKeyPressEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_POLYAFT ) ); const QEvent::Type ControlChangeEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_CTLCHG ) ); const QEvent::Type ProgramChangeEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_PROGRAM ) ); const QEvent::Type ChannelKeyPressEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_CHANAFT ) ); const QEvent::Type PitchWheelEventType = QEvent::Type( QEvent::registerEventType( QEvent::User + STATUS_BENDER) ); class NoteEvent : public QEvent { public: NoteEvent(unsigned char note, unsigned char val, QEvent::Type type) : QEvent(type), m_note(note), m_value(val) { } unsigned char getNote() const { return m_note; } unsigned char getValue() const { return m_value; } protected: unsigned char m_note; unsigned char m_value; }; class NoteOffEvent : public NoteEvent { public: NoteOffEvent(unsigned char note, unsigned char vel) : NoteEvent(note, vel, NoteOffEventType) { } }; class NoteOnEvent : public NoteEvent { public: NoteOnEvent(unsigned char note, unsigned char vel) : NoteEvent(note, vel, NoteOnEventType) { } }; class PolyKeyPressEvent : public NoteEvent { public: PolyKeyPressEvent(unsigned char note, unsigned char value) : NoteEvent(note, value, PolyKeyPressEventType) { } }; class ControlChangeEvent : public QEvent { public: ControlChangeEvent(unsigned char ctl, unsigned char value) : QEvent(ControlChangeEventType), m_ctl(ctl), m_value(value) { } unsigned char getController() const { return m_ctl; } unsigned char getValue() const { return m_value; } private: unsigned char m_ctl; unsigned char m_value; }; class ValueEvent : public QEvent { public: ValueEvent(int value, QEvent::Type type) : QEvent(type), m_value(value) { } int getValue() const { return m_value; } private: int m_value; }; class ProgramChangeEvent : public ValueEvent { public: ProgramChangeEvent(unsigned char value) : ValueEvent(value, ProgramChangeEventType) { } }; class ChannelKeyPressEvent : public ValueEvent { public: ChannelKeyPressEvent(unsigned char value) : ValueEvent(value, ChannelKeyPressEventType) { } }; class PitchWheelEvent : public ValueEvent { public: PitchWheelEvent(int value) : ValueEvent(value, PitchWheelEventType) { } }; #endif /* EVENTS_H */ vmpk-0.4.0/src/vpiano.ui0000644000175000001440000005435711572642326014170 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ VPiano 0 0 573 223 Virtual MIDI Piano Keyboard :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 0 0 0 573 20 &File &Edit &Help &Language &View &Tools Notes Controllers Programs true 0 0 &Notes Qt::ToolButtonTextOnly TopToolBarArea false 0 0 &Controllers Qt::ToolButtonTextOnly TopToolBarArea true 0 0 Pitch &Bender Qt::ToolButtonTextOnly TopToolBarArea true 0 0 &Programs Qt::ToolButtonTextOnly TopToolBarArea true 0 0 &Extra Controls Qt::ToolButtonTextOnly TopToolBarArea true &Quit Exit the program &Preferences Edit the program settings &Connections Edit the MIDI connections &About Show the About box About &Qt Show the Qt about box true &Notes Show or hide the Notes toolbar true &Controllers Show or hide the Controller toolbar true Pitch &Bender Show or hide the Pitch Bender toolbar true &Programs Show or hide the Programs toolbar true true &Status Bar Show or hide the Status Bar Panic Stops all active notes Esc Reset All Resets all the controllers Reset Resets the Bender value &Keyboard Map Edit the current keyboard layout &Contents Open the index of the help document F1 VMPK &Web site Open the VMPK web site address using a web browser &Import SoundFont... Import SoundFont true &Extra Controls Show or hide the Extra Controls toolbar Edit Open the Extra Controls editor false Edit Open the Banks/Programs editor false false &Extra Controllers Open the Extra Controls editor true N&ote Names Show or hide the note names &Shortcuts Open the Shortcuts editor Octave Up Play one octave higher Right Octave Down Play one octave lower Left Transpose Up Transpose one semitone higher Ctrl+Right Transpose Down Transpose one semitone lower Ctrl+Left Next Channel Play and listen next channel Up Previous Channel Play and listen previous channel Down Next Controller Select the next controller Ctrl++ Previous Controller Select the previous controller Ctrl+- Controller Up Increment the controller value + Controller Down Decrement the controller value - Next Bank Select the next instrument bank Ctrl+PgUp Previous Bank Select the previous instrument bank Ctrl+PgDown Next Program Select the next instrument program PgUp Previous Program Select the previous instrument program PgDown Velocity Up Increment note velocity End Velocity Down Decrement note velocity Home About &Translation Show information about the program language translation PianoKeybd QGraphicsView
pianokeybd.h
actionExit triggered() VPiano close() -1 -1 335 260 actionNotes toggled(bool) toolBarNotes setVisible(bool) -1 -1 37 38 actionControllers toggled(bool) toolBarControllers setVisible(bool) -1 -1 120 69 actionBender toggled(bool) toolBarBender setVisible(bool) -1 -1 205 92 actionPrograms toggled(bool) toolBarPrograms setVisible(bool) -1 -1 457 102 actionStatusBar toggled(bool) statusBar setVisible(bool) -1 -1 335 266 actionExtraControls toggled(bool) toolBarExtra setVisible(bool) -1 -1 338 125
vmpk-0.4.0/src/riffimportdlg.h0000644000175000001440000000324111572642326015340 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef RIFFIMPORTDLG_H #define RIFFIMPORTDLG_H #include #include #include "riff.h" namespace Ui { class RiffImportDlg; } typedef QMap Bank; class RiffImportDlg : public QDialog { Q_OBJECT public: RiffImportDlg(QWidget *parent = 0); ~RiffImportDlg(); void setInput(QString fileName); void setOutput(QString fileName); QString getOutput() { return m_output; } QString getInput() { return m_input; } QString getName() { return m_name; } void save(); void retranslateUi(); protected slots: void slotInstrument(int bank, int pc, QString name); void slotCompleted(QString name, QString version, QString copyright); void openInput(); void openOutput(); private: Ui::RiffImportDlg *ui; Riff* m_riff; QMap m_ins; QString m_input; QString m_output; QString m_name; }; #endif // RIFFIMPORTDLG_H vmpk-0.4.0/src/knob.h0000644000175000001440000000502511572642326013423 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. See http://qsynth.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef KNOB_H #define KNOB_H #include //------------------------------------------------------------------------- // Knob - A better QDial class Knob : public QDial { Q_OBJECT Q_PROPERTY( int defaultValue READ getDefaultValue WRITE setDefaultValue ) Q_PROPERTY( DialMode dialMode READ getDialMode WRITE setDialMode ) Q_ENUMS(DialMode) public: // Constructor. Knob(QWidget *pParent = 0); // Destructor. ~Knob() {} int getDefaultValue() const { return m_iDefaultValue; } // Knob dial mode behavior: // QDialMode - Old QDial behavior. // AngularMode - Angularly relative to widget center. // LinearMode - Proportionally to distance in one orthogonal axis. enum DialMode { QDialMode, AngularMode, LinearMode }; DialMode getDialMode() const { return m_dialMode; } public slots: // Set default (mid) value. void setDefaultValue(int iDefaultValue); // Set knob dial mode behavior. void setDialMode(DialMode dialMode); protected: // Mouse angle determination. float mouseAngle(const QPoint& pos); // Alternate mouse behavior event handlers. virtual void mousePressEvent(QMouseEvent *pMouseEvent); virtual void mouseMoveEvent(QMouseEvent *pMouseEvent); virtual void mouseReleaseEvent(QMouseEvent *pMouseEvent); virtual void wheelEvent(QWheelEvent *pWheelEvent); private: void updatePosition(int val); // Default (mid) value. int m_iDefaultValue; // Knob dial mode behavior. DialMode m_dialMode; // Alternate mouse behavior tracking. bool m_bMousePressed; QPoint m_posMouse; // Just for more precision on the movement float m_lastDragValue; }; #endif // KNOB_H vmpk-0.4.0/src/qticonloader.h0000644000175000001440000000415611572642326015162 0ustar pedrousers/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #ifndef QTICONLOADER_H #define QTICONLOADER_H #include // This is the QtIconLoader // Version 0.1 // class QtIconLoader { public: static QIcon icon(const QString &name, const QIcon &fallback = QIcon()); }; #endif // QTICONLOADER_H vmpk-0.4.0/src/extracontrols.ui0000644000175000001440000004377511572642326015605 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ DialogExtraControls 0 0 376 267 Extra Controls Editor :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 100 0 false QFrame::StyledPanel QFrame::Raised Label: txtLabel MIDI Controller: spinController 127 QFrame::NoFrame Add :/vpiano/list-add.svg:/vpiano/list-add.svg false Remove :/vpiano/list-remove.svg:/vpiano/list-remove.svg false Up false Down Qt::Vertical 20 40 false Switch Knob Spin box Slider Button Ctl Button SysEx false QFrame::StyledPanel QFrame::Raised 0 Default ON value ON: spinValueOn 127 value OFF: spinValueOff 127 Min. value: spinKnobMin 127 Max. value: spinKnobMax 127 Default value: spinKnobDef 127 Min. value: spinSpinMin 127 Max. value: spinSpinMax 127 Default value: spinSpinDef 127 Display size: spinSliderSize 9999 Min. value: spinSliderMin 127 Max. value: spinSliderMax 127 Default value: spinSliderDef 127 value: spinValueOn 127 Qt::Vertical 20 40 File name: Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft true ... Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok extraList txtLabel spinController chkSwitchDefOn spinValueOn spinValueOff spinKnobMin spinKnobMax spinKnobDef spinSpinMin spinSpinMax spinSpinDef spinSliderSize spinSliderMin spinSliderMax spinSliderDef btnAdd btnRemove btnUp btnDown buttonBox buttonBox accepted() DialogExtraControls accept() 254 298 157 274 buttonBox rejected() DialogExtraControls reject() 322 298 286 274 cboControlType currentIndexChanged(int) stackedPanel setCurrentIndex(int) 231 89 273 113 stackedPanel currentChanged(int) cboControlType setCurrentIndex(int) 134 111 164 89 vmpk-0.4.0/src/instrument.cpp0000644000175000001440000003542611572642326015245 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas For this file, the following copyright notice is also applicable: Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. See http://qtractor.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "instrument.h" #include #include #include #include #include //---------------------------------------------------------------------- // class Instrument -- instrument definition instance class. // // Retrieve patch/program list for given bank address. const InstrumentData& Instrument::patch ( int iBank ) const { if (m_pData->patches.contains(iBank)) return m_pData->patches[iBank]; return m_pData->patches[-1]; } // Retrieve key/notes list for given (bank, prog) pair. const InstrumentData& Instrument::notes ( int iBank, int iProg ) const { if (m_pData->keys.contains(iBank)) { if (m_pData->keys[iBank].contains(iProg)) { return m_pData->keys[iBank][iProg]; } else { return m_pData->keys[iBank][-1]; } } else if (iBank >= 0) return notes(-1, iProg); return m_pData->keys[-1][-1]; } // Check if given (bank, prog) pair is a drum patch. bool Instrument::isDrum ( int iBank, int iProg ) const { if (m_pData->drums.contains(iBank)) { if (m_pData->drums[iBank].contains(iProg)) { return (bool) m_pData->drums[iBank][iProg]; } else { return (bool) m_pData->drums[iBank][-1]; } } else if (iBank >= 0) return isDrum(-1, iProg); return false; return isDrum(-1, iProg); } //---------------------------------------------------------------------- // class InstrumentList -- A Cakewalk .ins file container class. // // Clear all contents. void InstrumentList::clearAll (void) { clear(); m_patches.clear(); m_notes.clear(); m_controllers.clear(); m_rpns.clear(); m_nrpns.clear(); m_files.clear(); } // Special list merge method. void InstrumentList::merge ( const InstrumentList& instruments ) { // Maybe its better not merging to itself. if (this == &instruments) return; // Names data lists merge... mergeDataList(m_patches, instruments.patches()); mergeDataList(m_notes, instruments.notes()); mergeDataList(m_controllers, instruments.controllers()); mergeDataList(m_rpns, instruments.rpns()); mergeDataList(m_nrpns, instruments.nrpns()); // Instrument merge... InstrumentList::ConstIterator it; for (it = instruments.begin(); it != instruments.end(); ++it) { Instrument& instr = (*this)[it.key()]; instr = it.value(); } } // Special instrument data list merge method. void InstrumentList::mergeDataList ( InstrumentDataList& dst, const InstrumentDataList& src ) { InstrumentDataList::ConstIterator it; for (it = src.begin(); it != src.end(); ++it) dst[it.key()] = it.value(); } // The official loaded file list. const QStringList& InstrumentList::files (void) const { return m_files; } // File load method. bool InstrumentList::load ( const QString& sFilename ) { // Open and read from real file. QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; enum FileSection { None = 0, PatchNames = 1, NoteNames = 2, ControlNames = 3, RpnNames = 4, NrpnNames = 5, InstrDefs = 6 } sect = None; Instrument *pInstrument = NULL; InstrumentData *pData = NULL; QRegExp rxTitle ("^\\[([^\\]]+)\\]$"); QRegExp rxData ("^([0-9]+)=(.*)$"); QRegExp rxBasedOn ("^BasedOn=(.+)$"); QRegExp rxBankSel ("^BankSelMethod=(0|1|2|3)$"); QRegExp rxUseNotes("^UsesNotesAsControllers=(0|1)$"); QRegExp rxControl ("^Control=(.+)$"); QRegExp rxRpn ("^RPN=(.+)$"); QRegExp rxNrpn ("^NRPN=(.+)$"); QRegExp rxPatch ("^Patch\\[([0-9]+|\\*)\\]=(.+)$"); QRegExp rxKey ("^Key\\[([0-9]+|\\*),([0-9]+|\\*)\\]=(.+)$"); QRegExp rxDrum ("^Drum\\[([0-9]+|\\*),([0-9]+|\\*)\\]=(0|1)$"); const QString s0_127 = "0..127"; const QString s1_128 = "1..128"; const QString s0_16383 = "0..16383"; const QString sAsterisk = "*"; // Read the file. unsigned int iLine = 0; QTextStream ts(&file); while (!ts.atEnd()) { // Read the line. iLine++; QString sLine = ts.readLine().simplified(); // If not empty, nor a comment, call the server... if (sLine.isEmpty() || sLine[0] == ';') continue; // Check for section intro line... if (sLine[0] == '.') { if (sLine == ".Patch Names") { sect = PatchNames; // m_patches.clear(); m_patches[s0_127].setName(s0_127); m_patches[s1_128].setName(s1_128); } else if (sLine == ".Note Names") { sect = NoteNames; // m_notes.clear(); m_notes[s0_127].setName(s0_127); } else if (sLine == ".Controller Names") { sect = ControlNames; // m_controllers.clear(); m_controllers[s0_127].setName(s0_127); } else if (sLine == ".RPN Names") { sect = RpnNames; // m_rpns.clear(); m_rpns[s0_16383].setName(s0_16383); } else if (sLine == ".NRPN Names") { sect = NrpnNames; // m_nrpns.clear(); m_nrpns[s0_16383].setName(s0_16383); } else if (sLine == ".Instrument Definitions") { sect = InstrDefs; // clear(); } else { // Unknown section found... qWarning("%s(%d): %s: Unknown section.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } // Go on... continue; } // Now it depends on the section... switch (sect) { case PatchNames: { if (rxTitle.exactMatch(sLine)) { // New patch name... const QString& sTitle = rxTitle.cap(1); pData = &(m_patches[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .Patch Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case NoteNames: { if (rxTitle.exactMatch(sLine)) { // New note name... const QString& sTitle = rxTitle.cap(1); pData = &(m_notes[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .Note Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case ControlNames: { if (rxTitle.exactMatch(sLine)) { // New controller name... const QString& sTitle = rxTitle.cap(1); pData = &(m_controllers[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .Controller Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case RpnNames: { if (rxTitle.exactMatch(sLine)) { // New RPN name... const QString& sTitle = rxTitle.cap(1); pData = &(m_rpns[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .RPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case NrpnNames: { if (rxTitle.exactMatch(sLine)) { // New NRPN name... const QString& sTitle = rxTitle.cap(1); pData = &(m_nrpns[sTitle]); pData->setName(sTitle); } else if (rxBasedOn.exactMatch(sLine)) { pData->setBasedOn(rxBasedOn.cap(1)); } else if (rxData.exactMatch(sLine)) { (*pData)[rxData.cap(1).toInt()] = rxData.cap(2); } else { qWarning("%s(%d): %s: Unknown .NRPN Names entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } case InstrDefs: { if (rxTitle.exactMatch(sLine)) { // New instrument definition... const QString& sTitle = rxTitle.cap(1); pInstrument = &((*this)[sTitle]); pInstrument->setInstrumentName(sTitle); } else if (rxBankSel.exactMatch(sLine)) { pInstrument->setBankSelMethod( rxBankSel.cap(1).toInt()); } else if (rxUseNotes.exactMatch(sLine)) { pInstrument->setUsesNotesAsControllers( (bool) rxBankSel.cap(1).toInt()); } else if (rxPatch.exactMatch(sLine)) { int iBank = (rxPatch.cap(1) == sAsterisk ? -1 : rxPatch.cap(1).toInt()); pInstrument->setPatch(iBank, m_patches[rxPatch.cap(2)]); } else if (rxControl.exactMatch(sLine)) { pInstrument->setControl(m_controllers[rxControl.cap(1)]); } else if (rxRpn.exactMatch(sLine)) { pInstrument->setRpn(m_rpns[rxRpn.cap(1)]); } else if (rxNrpn.exactMatch(sLine)) { pInstrument->setNrpn(m_nrpns[rxNrpn.cap(1)]); } else if (rxKey.exactMatch(sLine)) { int iBank = (rxKey.cap(1) == sAsterisk ? -1 : rxKey.cap(1).toInt()); int iProg = (rxKey.cap(2) == sAsterisk ? -1 : rxKey.cap(2).toInt()); pInstrument->setNotes(iBank, iProg, m_notes[rxKey.cap(3)]); } else if (rxDrum.exactMatch(sLine)) { int iBank = (rxDrum.cap(1) == sAsterisk ? -1 : rxDrum.cap(1).toInt()); int iProg = (rxDrum.cap(2) == sAsterisk ? -1 : rxKey.cap(2).toInt()); pInstrument->setDrum(iBank, iProg, (bool) rxDrum.cap(3).toInt()); } else { qWarning("%s(%d): %s: Unknown .Instrument Definitions entry.", sFilename.toUtf8().constData(), iLine, sLine.toUtf8().constData()); } break; } default: break; } } // Ok. We've read it all. file.close(); // We're in business... appendFile(sFilename); return true; } // File save method. bool InstrumentList::save ( const QString& sFilename ) { // Open and write into real file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; // A visula separator line. const QString sepl = "; -----------------------------" "------------------------------------------------"; // Write the file. QTextStream ts(&file); ts << sepl << endl; ts << "; " << QObject::tr("Cakewalk Instrument Definition File") << endl; /* ts << ";" << endl; ts << "; " << _TITLE " - " << QObject::tr(_SUBTITLE) << endl; ts << "; " << QObject::tr("Version") << ": " _VERSION << endl; ts << "; " << QObject::tr("Build") << ": " __DATE__ " " __TIME__ << endl; */ ts << ";" << endl; ts << "; " << QObject::tr("File") << ": " << QFileInfo(sFilename).fileName() << endl; ts << "; " << QObject::tr("Date") << ": " << QDate::currentDate().toString("MMM dd yyyy") << " " << QTime::currentTime().toString("hh:mm:ss") << endl; ts << ";" << endl; // - Patch Names... ts << sepl << endl << endl; ts << ".Patch Names" << endl; saveDataList(ts, m_patches); // - Note Names... ts << sepl << endl << endl; ts << ".Note Names" << endl; saveDataList(ts, m_notes); // - Controller Names... ts << sepl << endl << endl; ts << ".Controller Names" << endl; saveDataList(ts, m_controllers); // - RPN Names... ts << sepl << endl << endl; ts << ".RPN Names" << endl; saveDataList(ts, m_rpns); // - NRPN Names... ts << sepl << endl << endl; ts << ".NRPN Names" << endl; saveDataList(ts, m_nrpns); // - Instrument Definitions... ts << sepl << endl << endl; ts << ".Instrument Definitions" << endl; ts << endl; InstrumentList::Iterator iter; for (iter = begin(); iter != end(); ++iter) { Instrument& instr = *iter; ts << "[" << instr.instrumentName() << "]" << endl; if (instr.bankSelMethod() > 0) ts << "BankSelMethod=" << instr.bankSelMethod() << endl; if (!instr.control().name().isEmpty()) ts << "Control=" << instr.control().name() << endl; if (!instr.rpn().name().isEmpty()) ts << "RPN=" << instr.rpn().name() << endl; if (!instr.nrpn().name().isEmpty()) ts << "NRPN=" << instr.nrpn().name() << endl; // - Patches... InstrumentPatches::ConstIterator pit; for (pit = instr.patches().begin(); pit != instr.patches().end(); ++pit) { int iBank = pit.key(); const QString sBank = (iBank < 0 ? QString("*") : QString::number(iBank)); ts << "Patch[" << sBank << "]=" << pit.value().name() << endl; } // - Keys... InstrumentKeys::ConstIterator kit; for (kit = instr.keys().begin(); kit != instr.keys().end(); ++kit) { int iBank = kit.key(); const QString sBank = (iBank < 0 ? QString("*") : QString::number(iBank)); const InstrumentNotes& notes = kit.value(); InstrumentNotes::ConstIterator nit; for (nit = notes.begin(); nit != notes.end(); ++nit) { int iProg = nit.key(); const QString sProg = (iProg < 0 ? QString("*") : QString::number(iProg)); ts << "Key[" << sBank << "," << sProg << "]=" << nit.value().name() << endl; } } // - Drums... InstrumentDrums::ConstIterator dit; for (dit = instr.drums().begin(); dit != instr.drums().end(); ++dit) { int iBank = dit.key(); const QString sBank = (iBank < 0 ? QString("*") : QString::number(iBank)); const InstrumentDrumFlags& flags = dit.value(); InstrumentDrumFlags::ConstIterator fit; for (fit = flags.begin(); fit != flags.end(); ++fit) { int iProg = fit.key(); const QString sProg = (iProg < 0 ? QString("*") : QString::number(iProg)); ts << "Drum[" << sBank << "," << sProg << "]=" << fit.value() << endl; } } ts << endl; } // Done. file.close(); return true; } void InstrumentList::saveDataList ( QTextStream& ts, const InstrumentDataList& list ) { ts << endl; InstrumentDataList::ConstIterator it; for (it = list.begin(); it != list.end(); ++it) { ts << "[" << it.value().name() << "]" << endl; saveData(ts, it.value()); } } void InstrumentList::saveData ( QTextStream& ts, const InstrumentData& data ) { if (!data.basedOn().isEmpty()) ts << "BasedOn=" << data.basedOn() << endl; InstrumentData::ConstIterator it; for (it = data.constBegin(); it != data.constEnd(); ++it) ts << it.key() << "=" << it.value() << endl; ts << endl; } vmpk-0.4.0/src/kmapdialog.h0000644000175000001440000000255311572642326014605 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef KMAPDIALOG_H #define KMAPDIALOG_H #include "ui_kmapdialog.h" #include "keyboardmap.h" #include class KMapDialog : public QDialog { Q_OBJECT public: KMapDialog(QWidget *parent = 0); void load(const QString fileName); void save(const QString fileName); void displayMap(const KeyboardMap* map); void getMap(KeyboardMap* map); void retranslateUi(); public slots: void slotOpen(); void slotSave(); private: void updateMap(); QPushButton* m_btnOpen; QPushButton* m_btnSave; KeyboardMap m_map; Ui::KMapDialogClass ui; }; #endif // KMAPDIALOG_H vmpk-0.4.0/src/RtMidi.h0000644000175000001440000002521411572642326013664 0ustar pedrousers/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2011 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ // RtMidi: Version 1.0.14 #ifndef RTMIDI_H #define RTMIDI_H #include "RtError.h" #include class RtMidi { public: //! Pure virtual openPort() function. virtual void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual openVirtualPort() function. virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual getPortCount() function. virtual unsigned int getPortCount() = 0; //! Pure virtual getPortName() function. virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; //! Pure virtual closePort() function. virtual void closePort( void ) = 0; protected: RtMidi(); virtual ~RtMidi() {}; // A basic error reporting function for internal use in the RtMidi // subclasses. The behavior of this function can be modified to // suit specific needs. void error( RtError::Type type ); void *apiData_; bool connected_; std::string errorString_; }; /**********************************************************************/ /*! \class RtMidiIn \brief A realtime MIDI input class. This class provides a common, platform-independent API for realtime MIDI input. It allows access to a single MIDI input port. Incoming MIDI messages are either saved to a queue for retrieval using the getMessage() function or immediately passed to a user-specified callback function. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X and Linux ALSA MIDI APIs, it is also possible to open a virtual input port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2008. */ /**********************************************************************/ #include #include class RtMidiIn : public RtMidi { public: //! User callback function type definition. typedef void (*RtMidiCallback)( double timeStamp, std::vector *message, void *userData); //! Default constructor that allows an optional client name. /*! An exception will be thrown if a MIDI system initialization error occurs. */ RtMidiIn( const std::string clientName = std::string( "RtMidi Input Client") ); //! If a MIDI connection is still open, it will be closed by the destructor. ~RtMidiIn(); //! Open a MIDI input connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. */ void openPort( unsigned int portNumber = 0, const std::string Portname = std::string( "RtMidi Input" ) ); //! Create a virtual input port, with optional name, to allow software connections (OS X and ALSA only). /*! This function creates a virtual MIDI input port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X and Linux ALSA APIs (the function does nothing for the other APIs). */ void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); //! Set a callback function to be invoked for incoming MIDI messages. /*! The callback function will be called whenever an incoming MIDI message is received. While not absolutely necessary, it is best to set the callback function before opening a MIDI port to avoid leaving some messages in the queue. */ void setCallback( RtMidiCallback callback, void *userData = 0 ); //! Cancel use of the current callback function (if one exists). /*! Subsequent incoming MIDI messages will be written to the queue and can be retrieved with the \e getMessage function. */ void cancelCallback(); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Return the number of available MIDI input ports. unsigned int getPortCount(); //! Return a string identifier for the specified MIDI input port number. /*! An empty string is returned if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Set the maximum number of MIDI messages to be saved in the queue. /*! If the queue size limit is reached, incoming messages will be ignored. The default limit is 1024. */ void setQueueSizeLimit( unsigned int queueSize ); //! Specify whether certain MIDI message types should be queued or ignored during input. /*! By default, MIDI timing and active sensing messages are ignored during message input because of their relative high data rates. MIDI sysex messages are ignored by default as well. Variable values of "true" imply that the respective message type will be ignored. */ void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); //! Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds. /*! This function returns immediately whether a new message is available or not. A valid message is indicated by a non-zero vector size. An exception is thrown if an error occurs during message retrieval or an input connection was not previously established. */ double getMessage( std::vector *message ); // A MIDI structure used internally by the class to store incoming // messages. Each message represents one and only one MIDI message. struct MidiMessage { std::vector bytes; double timeStamp; // Default constructor. MidiMessage() :bytes(3), timeStamp(0.0) {} }; // The RtMidiInData structure is used to pass private class data to // the MIDI input handling function or thread. struct RtMidiInData { std::queue queue; MidiMessage message; unsigned int queueLimit; unsigned char ignoreFlags; bool doInput; bool firstMessage; void *apiData; bool usingCallback; void *userCallback; void *userData; bool continueSysex; // Default constructor. RtMidiInData() : queueLimit(1024), ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false), userCallback(0), userData(0), continueSysex(false) {} }; private: void initialize( const std::string& clientName ); RtMidiInData inputData_; }; /**********************************************************************/ /*! \class RtMidiOut \brief A realtime MIDI output class. This class provides a common, platform-independent API for MIDI output. It allows one to probe available MIDI output ports, to connect to one such port, and to send MIDI bytes immediately over the connection. Create multiple instances of this class to connect to more than one MIDI device at the same time. by Gary P. Scavone, 2003-2008. */ /**********************************************************************/ class RtMidiOut : public RtMidi { public: //! Default constructor that allows an optional client name. /*! An exception will be thrown if a MIDI system initialization error occurs. */ RtMidiOut( const std::string clientName = std::string( "RtMidi Output Client" ) ); //! The destructor closes any open MIDI connections. ~RtMidiOut(); //! Open a MIDI output connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. An exception is thrown if an error occurs while attempting to make the port connection. */ void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Output" ) ); //! Close an open MIDI connection (if one exists). void closePort(); //! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only). /*! This function creates a virtual MIDI output port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X and Linux ALSA APIs (the function does nothing with the other APIs). An exception is thrown if an error occurs while attempting to create the virtual port. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); //! Return the number of available MIDI output ports. unsigned int getPortCount(); //! Return a string identifier for the specified MIDI port type and number. /*! An empty string is returned if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Immediately send a single message out an open MIDI output port. /*! An exception is thrown if an error occurs during output or an output connection was not previously established. */ void sendMessage( std::vector *message ); private: void initialize( const std::string& clientName ); }; #endif vmpk-0.4.0/src/udpmidi.cpp0000644000175000001440000002212111572642326014454 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ /* * This code is based on Qmidinet, by Rui Nuno Capela: http://qmidinet.sf.net */ #if defined(NETWORK_MIDI) #include #include #if defined(__SYMBIAN32__) #include #include #include #include #include #else #if defined(WIN32) #include #include #else #include #include #include #endif #endif #include #include #include "RtMidi.h" #include "preferences.h" int g_iUdpPort = NETWORKPORTNUMBER; struct NetworkMidiData { NetworkMidiData(): socket(0), thread(0) { } int socket; struct sockaddr_in sockaddr; class UdpDeviceThread *thread; }; #if defined(WIN32) static WSADATA g_wsaData; typedef int socklen_t; static void __attribute__((constructor)) startup() { qDebug() << "startup"; WSAStartup(MAKEWORD(1, 1), &g_wsaData); } static void __attribute__((destructor)) cleanup() { qDebug() << "cleanup"; WSACleanup(); } #endif /* RtMidiIn */ class UdpDeviceThread : public QThread { public: UdpDeviceThread(RtMidiIn::RtMidiInData *data) : QThread(), m_data(data) { } protected: void run(); private: RtMidiIn::RtMidiInData *m_data; }; void UdpDeviceThread::run (void) { NetworkMidiData *apiData = static_cast (m_data->apiData); RtMidiIn::MidiMessage message; qDebug() << "running!"; while (m_data->doInput) { fd_set fds; FD_ZERO(&fds); FD_SET(apiData->socket, &fds); int fdmax = apiData->socket; struct timeval tv; tv.tv_sec = 1; // timeout period (1 second)... tv.tv_usec = 0; int s = ::select(fdmax + 1, &fds, NULL, NULL, &tv); if (s < 0) { qDebug() << "RtMidiIn: select = " << s << ": " << ::strerror(s); break; } if (s == 0) { //qDebug() << "\nRtMidiIn: timeout"; continue; } // A Network event if (FD_ISSET(apiData->socket, &fds)) { // Read from network... unsigned char buf[1024]; struct sockaddr_in sender; socklen_t slen = sizeof(sender); int r = ::recvfrom(apiData->socket, (char *) buf, sizeof(buf), 0, (struct sockaddr *) &sender, &slen); if (r > 0) { message.timeStamp = 0; message.bytes.clear(); for ( int i = 0; i < r; ++i ) { message.bytes.push_back( buf[i] ); } if ( m_data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) m_data->userCallback; callback(message.timeStamp, &message.bytes, m_data->userData); } else { if ( m_data->queueLimit > m_data->queue.size() ) { m_data->queue.push( message ); } else { qDebug() << "RtMidiIn: message queue limit reached!!\n\n"; } } } else if (r < 0) { qDebug() << "RtMidiIn: recvfrom=" << r; } } } } void RtMidiIn :: initialize( const std::string& /*clientName*/ ) { NetworkMidiData *data = new NetworkMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. NetworkMidiData *data = (NetworkMidiData *) inputData_.apiData ; delete data; } void RtMidiIn :: openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) { NetworkMidiData *data = static_cast (apiData_); // Setup network protocol... data->socket = ::socket(PF_INET, SOCK_DGRAM, 0); if (data->socket < 0) { qDebug() << "socket(in)"; return; } struct sockaddr_in addrin; ::memset(&addrin, 0, sizeof(addrin)); addrin.sin_family = AF_INET; addrin.sin_addr.s_addr = htonl(INADDR_ANY); addrin.sin_port = htons(g_iUdpPort); if (::bind(data->socket, (struct sockaddr *) (&addrin), sizeof(addrin)) < 0) { qDebug() << "bind"; return; } // Will Hall, 2007 // INADDR_ANY will bind to default interface, struct in_addr if_addr_in; if_addr_in.s_addr = htonl(INADDR_ANY); struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = ::inet_addr("225.0.0.37"); mreq.imr_interface.s_addr = if_addr_in.s_addr; if (::setsockopt (data->socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) < 0) { qDebug() << "setsockopt(IP_ADD_MEMBERSHIP)"; errorString_ = "RtMidiIn::openPort: OS is probably missing multicast support."; error( RtError::SYSTEM_ERROR ); } // start the input thread data->thread = new UdpDeviceThread(&inputData_); inputData_.doInput = true; data->thread->start(); if (data->thread == 0 || !data->thread->isRunning()) { inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } void RtMidiIn :: openVirtualPort( const std::string /*portName*/ ) { errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in UDP!"; error( RtError::WARNING ); } unsigned int RtMidiIn :: getPortCount() { return 1; } std::string RtMidiIn :: getPortName( unsigned int /*portNumber*/ ) { std::ostringstream ost; ost << "UDP/" << g_iUdpPort; return ost.str(); } void RtMidiIn :: closePort() { NetworkMidiData *data = static_cast (apiData_); // Shutdown the input thread. if (data->thread != 0) { if (data->thread->isRunning()) { inputData_.doInput = false; data->thread->wait(1200); // Timeout>1sec. } delete data->thread; data->thread = 0; } // close socket if (data->socket >= 0) { #if defined(WIN32) ::closesocket(data->socket); #else ::close(data->socket); #endif data->socket = 0; } } /* RtMidiOut */ void RtMidiOut :: initialize( const std::string& /*clientName*/ ) { NetworkMidiData *data = new NetworkMidiData; apiData_ = (void *) data; } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. NetworkMidiData *data = (NetworkMidiData *) apiData_; delete data; } void RtMidiOut :: openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) { NetworkMidiData *data = static_cast (apiData_); data->socket = ::socket(AF_INET, SOCK_DGRAM, 0); if (data->socket < 0) { errorString_ = "RtMidiOut::openPort: error creating a socket"; error( RtError::SYSTEM_ERROR ); } ::memset(&data->sockaddr, 0, sizeof(data->sockaddr)); data->sockaddr.sin_family = AF_INET; data->sockaddr.sin_addr.s_addr = ::inet_addr("225.0.0.37"); data->sockaddr.sin_port = htons(g_iUdpPort); // Turn off loopback... int loop = 0; if (::setsockopt(data->socket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *) &loop, sizeof (loop)) < 0) { qDebug() << "setsockopt(IP_MULTICAST_LOOP)"; return; } } void RtMidiOut :: openVirtualPort( const std::string /*portName*/ ) { errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in UDP!"; error( RtError::WARNING ); } unsigned int RtMidiOut :: getPortCount() { return 1; } std::string RtMidiOut :: getPortName( unsigned int /*portNumber*/ ) { std::ostringstream ost; ost << "UDP/" << g_iUdpPort; return ost.str(); } void RtMidiOut :: closePort() { NetworkMidiData *data = static_cast (apiData_); if (data->socket >= 0) { #if defined(WIN32) ::closesocket(data->socket); #else ::close(data->socket); #endif data->socket = 0; } } void RtMidiOut :: sendMessage( std::vector *message ) { NetworkMidiData *data = static_cast (apiData_); if (data->socket <= 0) { qDebug() << "socket = " << data->socket; return; } if (::sendto(data->socket, (char *) &((*message)[0]), message->size(), 0, (struct sockaddr*) &data->sockaddr, sizeof(data->sockaddr)) < 0) { qDebug() << "sendto"; return; } } #endif vmpk-0.4.0/src/mididefs.h0000644000175000001440000000301111572642326014247 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef MIDIDEFS_H #define MIDIDEFS_H #define MASK_CHANNEL 0x0f #define MASK_STATUS 0xf0 #define MASK_SAFETY 0x7f #define CTL_MSB 0 #define CTL_LSB 0x20 #define CTL_ALL_SOUND_OFF 0x78 #define CTL_RESET_ALL_CTL 0x79 #define CTL_ALL_NOTES_OFF 0x7B #define STATUS_NOTEOFF 0x80 #define STATUS_NOTEON 0x90 #define STATUS_POLYAFT 0xA0 #define STATUS_CTLCHG 0xB0 #define STATUS_PROGRAM 0xC0 #define STATUS_CHANAFT 0xD0 #define STATUS_BENDER 0xE0 #define BENDER_MIN -8192 #define BENDER_MAX 8191 #define BENDER_MID 0x2000 #define CALC_LSB(x) (x % 0x80) #define CALC_MSB(x) (x / 0x80) #define CTL_VOLUME 7 #define CTL_PAN 10 #define CTL_EXPRESSION 11 #endif /* MIDIDEFS_H */ vmpk-0.4.0/src/riffimportdlg.cpp0000644000175000001440000001167311572642326015703 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include #include #include #include #include #include "riffimportdlg.h" #include "ui_riffimportdlg.h" RiffImportDlg::RiffImportDlg(QWidget *parent) : QDialog(parent), ui(new Ui::RiffImportDlg) { m_riff = new Riff(this); connect(m_riff, SIGNAL(signalInstrument(int, int, QString)), SLOT(slotInstrument(int, int, QString))); connect(m_riff, SIGNAL(signalSoundFont(QString, QString, QString)), SLOT(slotCompleted(QString, QString, QString))); connect(m_riff, SIGNAL(signalDLS(QString, QString, QString)), SLOT(slotCompleted(QString, QString, QString))); ui->setupUi(this); connect(ui->m_inputBtn, SIGNAL(clicked()), SLOT(openInput())); connect(ui->m_outputBtn, SIGNAL(clicked()), SLOT(openOutput())); } RiffImportDlg::~RiffImportDlg() { delete ui; } void RiffImportDlg::openInput() { QString fileName = QFileDialog::getOpenFileName(this, tr("Input SoundFont"), QString::null, tr("SoundFonts (*.sf2 *.sbk *.dls)")); if (!fileName.isEmpty()) { setInput(fileName); m_riff->readFromFile(m_input); } } void RiffImportDlg::openOutput() { QString fileName = QFileDialog::getSaveFileName(this, tr("Output"), m_output, tr("Instrument definitions (*.ins)")); if (!fileName.isEmpty()) setOutput(fileName); } void RiffImportDlg::setInput(QString fileName) { QFileInfo f(fileName); if (f.exists()) { ui->m_input->setText(m_input = fileName); #if QT_VERSION < 0x040400 QDir dir = QDir::home(); #else QDir dir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); #endif QString fullFilespec = dir.absoluteFilePath(f.baseName() + ".ins"); setOutput(fullFilespec); } } void RiffImportDlg::setOutput(QString fileName) { ui->m_output->setText(m_output = fileName); } void RiffImportDlg::slotInstrument(int bank, int pc, QString name) { m_ins[bank][pc] = name; } void RiffImportDlg::slotCompleted(QString name, QString version, QString copyright) { ui->m_name->setText(m_name = name); ui->m_version->setText(version); ui->m_copyright->setText(copyright); } void RiffImportDlg::save() { QFile data(m_output); if (data.open(QFile::WriteOnly | QFile::Truncate)) { QTextStream out(&data); out << "; Name: " << m_name << endl; out << "; Version: " << ui->m_version->text() << endl; out << "; Copyright: " << ui->m_copyright->text() << endl << endl; out << endl << ".Patch Names" << endl; QMapIterator i(m_ins); while( i.hasNext() ) { i.next(); out << endl << "[Bank" << i.key() << "]" << endl; Bank b = i.value(); QMapIterator j(b); while( j.hasNext() ) { j.next(); out << j.key() << "=" << j.value() << endl; } } out << endl << ".Controller Names" << endl; out << endl << "[Standard]" << endl; out << "1=1-Modulation" << endl; out << "2=2-Breath" << endl; out << "4=4-Foot controller" << endl; out << "5=5-Portamento time" << endl; out << "7=7-Volume" << endl; out << "8=8-Balance" << endl; out << "10=10-Pan" << endl; out << "11=11-Expression" << endl; out << "64=64-Pedal (sustain)" << endl; out << "65=65-Portamento" << endl; out << "66=66-Pedal (sostenuto)" << endl; out << "67=67-Pedal (soft)" << endl; out << "69=69-Hold 2" << endl; out << "91=91-External Effects depth" << endl; out << "92=92-Tremolo depth" << endl; out << "93=93-Chorus depth" << endl; out << "94=94-Celeste (detune) depth" << endl; out << "95=95-Phaser depth" << endl; out << endl << ".Instrument Definitions" << endl; out << endl << "[" << m_name << "]" << endl; out << "Control=Standard" << endl; i.toFront(); while( i.hasNext() ) { i.next(); out << "Patch[" << i.key() << "]=Bank" << i.key() << endl; } data.close(); } } void RiffImportDlg::retranslateUi() { ui->retranslateUi(this); } vmpk-0.4.0/src/vpianoico.rc0000644000175000001440000000007411572642326014635 0ustar pedrousersIDI_ICON1 ICON DISCARDABLE "vmpk.ico" vmpk-0.4.0/src/riff.h0000644000175000001440000000505111572642326013417 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef RIFF_H #define RIFF_H #include #include #define CKID_RIFF 0x46464952 #define CKID_LIST 0x5453494c #define CKID_SFBK 0x6b626673 #define CKID_INFO 0x4f464e49 #define CKID_PDTA 0x61746470 #define CKID_IFIL 0x6c696669 #define CKID_INAM 0x4d414e49 #define CKID_PHDR 0x72646870 #define CKID_DLS 0x20534C44 #define CKID_COLH 0x686c6f63 #define CKID_VERS 0x73726576 #define CKID_LINS 0x736e696c #define CKID_ICOP 0x504f4349 #define CKID_INS 0x20736e69 #define CKID_INSH 0x68736e69 class Riff : public QObject { Q_OBJECT public: Riff(QObject* parent = 0); virtual ~Riff(); void readFromFile(QString fileName); void readFromStream(QDataStream* ds); signals: void signalSoundFont(QString name, QString version, QString copyright); void signalDLS(QString name, QString version, QString copyright); void signalInstrument(int bank, int pc, QString name); void signalPercussion(int bank, int pc, QString name); private: /* SoundFont */ void processSF(int size); void processSFList(int size); void processPDTA(int size); void processPHDR(int size); QString readSFVersion(); /* DLS */ void processDLS(int size); void processDLSList(int size); void processLINS(int size); void processINS(int size); void processINSH(quint32& bank, quint32& pc, bool& perc); QString readDLSVersion(); /* common */ void read(); void processINFO(int size); quint32 readExpectedChunk(quint32 cktype); quint32 readChunk(quint32& cktype); quint32 readChunkID(); quint16 read16bit(); quint32 read32bit(); QString readstr(int size); void skip(int size); QDataStream *m_IOStream; QString m_fileName; QString m_name; QString m_copyright; QString m_version; }; #endif // RIFF_H vmpk-0.4.0/src/vmpk.ico0000644000175000001440000001226611572642326013777 0ustar pedrousers h&  ((  8l="""F 3U ^///_%%%1 """Jv999x 3>>>A111M!!!'''D]]]L888"""%%%MoRRRuuuDDDJJJ444Xjjjjjj|||333SSS???""" (((:::MMMIII444$$,'  & "GNU:::VVV ??@XZh&N5c@r0M)O{>_ 0R[b'VGGG -H,M7]-Gb_]^R|X5;U#d ^R= *j\^ht0:g ^S IC61TUY[3;\ Q D?6 &IJLA06M D< t 888*.2?.4M$(7!4?(@ 4<<< q ---"*** :::333.&&&C>>> j+++_III7i Q!!!~666mPPPS A [,,,q&&&)));+++YYYa;;;...000C;;;___AAA555### _!!!TTT444m...eee666WWWdddQQQ???#:::\\\aaaJJJ H <<$M)S.Z4b:iBt$Mz!S R T4REm4Q@@@www6@Z1\:j Ct J~!RR3BP#i#p$qa#od[EdV CCC{{{Z\`!  ' 1 3QaqCmJtM{?bu+>Z 1CDF6=^"] b ^ YPB2 3J BCGHPm q j d ^ YSMH0>8 $EcdkTXn h d ^ YRMH&.G>95 -YY[Z]l_ ^ YRMB(2V>95 0SST[]hX XRM =C>95 0 !`JJJ[]f ORMAC>95 0 #CCCkVX]GM AC>9 04333POOS @FC; &&& This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "pianoscene.h" #if defined(RAWKBD_SUPPORT) #include "rawkeybdapp.h" #endif #include #include #include #include #include #define KEYWIDTH 18 #define KEYHEIGHT 72 PianoScene::PianoScene ( const int baseOctave, const int numOctaves, const QColor& keyPressedColor, QObject * parent ) : QGraphicsScene( QRectF(0, 0, KEYWIDTH * numOctaves * 7, KEYHEIGHT), parent ), m_baseOctave( baseOctave ), m_numOctaves( numOctaves ), m_minNote( 0 ), m_maxNote( 127 ), m_transpose( 0 ), m_showLabels( false ), m_useFlats( false ), m_rawkbd( false ), m_keyPressedColor( keyPressedColor ), m_mousePressed( false ), m_velocity( 100 ), m_handler( 0 ) { QBrush hilightBrush(m_keyPressedColor.isValid() ? m_keyPressedColor : QApplication::palette().highlight()); QFont lblFont(QApplication::font()); int i, numkeys = m_numOctaves * 12; lblFont.setPointSize(KEYLABELFONTSIZE); for(i = 0; i < numkeys; ++i) { float x = 0; PianoKey* key = NULL; KeyLabel* lbl = NULL; int octave = i / 12 * 7; int j = i % 12; if (j >= 5) j++; if ((j % 2) == 0) { x = (octave + j / 2) * KEYWIDTH; key = new PianoKey( QRectF(x, 0, KEYWIDTH, KEYHEIGHT), false, i ); lbl = new KeyLabel(key); lbl->setDefaultTextColor(Qt::black); lbl->setPos(x, KEYHEIGHT); } else { x = (octave + j / 2) * KEYWIDTH + KEYWIDTH * 6/10 + 1; key = new PianoKey( QRectF( x, 0, KEYWIDTH * 8/10 - 1, KEYHEIGHT * 6/10 ), true, i ); key->setZValue( 1 ); lbl = new KeyLabel(key); lbl->setDefaultTextColor(Qt::white); lbl->setPos(x - 3, KEYHEIGHT * 6/10 - 3); } if (m_keyPressedColor.isValid()) key->setPressedBrush(hilightBrush); m_keys.insert(i, key); addItem( key ); lbl->setFont(lblFont); m_labels.insert(i, lbl); } hideOrShowKeys(); retranslate(); } QSize PianoScene::sizeHint() const { return QSize(KEYWIDTH * m_numOctaves * 7, KEYHEIGHT); } void PianoScene::showKeyOn( PianoKey* key, int vel ) { if (vel >= 0 && m_keyPressedColor.isValid() ) { QBrush hilightBrush(m_keyPressedColor.lighter(200 - vel)); key->setPressedBrush(hilightBrush); } key->setPressed(true); } void PianoScene::showKeyOff( PianoKey* key, int ) { key->setPressed(false); } void PianoScene::showNoteOn( const int note, int vel ) { int n = note - m_baseOctave*12 - m_transpose; if ((note >= m_minNote) && (note <= m_maxNote) && (n >= 0) && (n < m_keys.size())) showKeyOn(m_keys[n], vel); } void PianoScene::showNoteOff( const int note, int vel ) { int n = note - m_baseOctave*12 - m_transpose; if ((note >= m_minNote) && (note <= m_maxNote) && (n >= 0) && (n < m_keys.size())) showKeyOff(m_keys[n], vel); } void PianoScene::triggerNoteOn( const int note, const int vel ) { int n = m_baseOctave*12 + note + m_transpose; if ((n >= m_minNote) && (n <= m_maxNote)) { if (m_handler != NULL) { m_handler->noteOn(n, vel); } else { emit noteOn(n, vel); } } } void PianoScene::triggerNoteOff( const int note, const int vel ) { int n = m_baseOctave*12 + note + m_transpose; if ((n >= m_minNote) && (n <= m_maxNote)) { if (m_handler != NULL) { m_handler->noteOff(n, vel); } else { emit noteOff(n, vel); } } } void PianoScene::keyOn( PianoKey* key ) { triggerNoteOn(key->getNote(), m_velocity); showKeyOn(key, m_velocity); } void PianoScene::keyOff( PianoKey* key ) { triggerNoteOff(key->getNote(), 0); showKeyOff(key, 0); } void PianoScene::keyOn( PianoKey* key, qreal pressure ) { int vel = m_velocity * pressure; triggerNoteOn(key->getNote(), vel); showKeyOn(key, vel); } void PianoScene::keyOff( PianoKey* key, qreal pressure ) { int vel = m_velocity * pressure; triggerNoteOff(key->getNote(), vel); showKeyOff(key, vel); } void PianoScene::keyOn(const int note) { if (note >=0 && note < m_keys.size()) keyOn(m_keys[note]); else triggerNoteOn(note, m_velocity); } void PianoScene::keyOff(const int note) { if (note >=0 && note < m_keys.size()) keyOff(m_keys[note]); else triggerNoteOff(note, m_velocity); } PianoKey* PianoScene::getKeyForPos( const QPointF& p ) const { QGraphicsItem *itm = itemAt(p); while (itm != NULL && itm->parentItem() != NULL) itm = itm->parentItem(); if (itm != NULL) { PianoKey* key = dynamic_cast(itm); return key; } return NULL; } void PianoScene::mouseMoveEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { if (m_mousePressed) { PianoKey* key = getKeyForPos(mouseEvent->scenePos()); PianoKey* lastkey = getKeyForPos(mouseEvent->lastScenePos()); if ((lastkey != NULL) && (lastkey != key) && lastkey->isPressed()) { keyOff(lastkey); } if ((key != NULL) && !key->isPressed()) { keyOn(key); } mouseEvent->accept(); return; } mouseEvent->ignore(); } void PianoScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { PianoKey* key = getKeyForPos(mouseEvent->scenePos()); if (key != NULL && !key->isPressed()) { keyOn(key); m_mousePressed = true; mouseEvent->accept(); return; } mouseEvent->ignore(); } void PianoScene::mouseReleaseEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { m_mousePressed = false; PianoKey* key = getKeyForPos(mouseEvent->scenePos()); if (key != NULL && key->isPressed()) { keyOff(key); mouseEvent->accept(); return; } mouseEvent->ignore(); } int PianoScene::getNoteFromKey( const int key ) const { if (m_keybdMap != NULL) { KeyboardMap::ConstIterator it = m_keybdMap->constFind(key); if ((it != m_keybdMap->constEnd()) && (it.key() == key)) { int note = it.value(); return note; } } return -1; } PianoKey* PianoScene::getPianoKey( const int key ) const { int note = getNoteFromKey(key); if ((note >= 0) && (note < m_keys.size())) return m_keys[note]; return NULL; } void PianoScene::keyPressEvent ( QKeyEvent * keyEvent ) { if ( !m_rawkbd && !keyEvent->isAutoRepeat() ) { // ignore auto-repeats int note = getNoteFromKey(keyEvent->key()); if (note > -1) keyOn(note); } keyEvent->accept(); } void PianoScene::keyReleaseEvent ( QKeyEvent * keyEvent ) { if ( !m_rawkbd && !keyEvent->isAutoRepeat() ) { // ignore auto-repeats int note = getNoteFromKey(keyEvent->key()); if (note > -1) keyOff(note); } keyEvent->accept(); } bool PianoScene::event(QEvent *event) { switch(event->type()) { case QEvent::TouchBegin: case QEvent::TouchEnd: case QEvent::TouchUpdate: { QTouchEvent *touchEvent = static_cast(event); QList touchPoints = touchEvent->touchPoints(); foreach(const QTouchEvent::TouchPoint& touchPoint, touchPoints) { switch (touchPoint.state()) { case Qt::TouchPointReleased: { PianoKey* key = getKeyForPos(touchPoint.scenePos()); if (key != NULL && key->isPressed()) { keyOff(key, touchPoint.pressure()); } break; } case Qt::TouchPointPressed: { PianoKey* key = getKeyForPos(touchPoint.scenePos()); if (key != NULL && !key->isPressed()) { keyOn(key, touchPoint.pressure()); } break; } case Qt::TouchPointMoved: { PianoKey* key = getKeyForPos(touchPoint.scenePos()); PianoKey* lastkey = getKeyForPos(touchPoint.lastScenePos()); if ((lastkey != NULL) && (lastkey != key) && lastkey->isPressed()) { keyOff(lastkey, touchPoint.pressure()); } if ((key != NULL) && !key->isPressed()) { keyOn(key, touchPoint.pressure()); } break; } default: break; } } break; } default: return QGraphicsScene::event(event); } event->accept(); return true; } void PianoScene::allKeysOff() { QList::ConstIterator it; for(it = m_keys.constBegin(); it != m_keys.constEnd(); ++it) { (*it)->setPressed(false); } } void PianoScene::setKeyPressedColor(const QColor& color) { if (color.isValid() && (color != m_keyPressedColor)) { m_keyPressedColor = color; QBrush hilightBrush(m_keyPressedColor); foreach(PianoKey* key, m_keys) { key->setPressedBrush(hilightBrush); } } } void PianoScene::hideOrShowKeys() { QListIterator it(m_keys); while(it.hasNext()) { PianoKey* key = it.next(); int n = m_baseOctave*12 + key->getNote() + m_transpose; bool b = !(n > m_maxNote) && !(n < m_minNote); key->setVisible(b); } } void PianoScene::setMinNote(const int note) { if (m_minNote != note) { m_minNote = note; hideOrShowKeys(); } } void PianoScene::setMaxNote(const int note) { if (m_maxNote != note) { m_maxNote = note; hideOrShowKeys(); } } void PianoScene::setBaseOctave(const int base) { if (m_baseOctave != base) { m_baseOctave = base; hideOrShowKeys(); refreshLabels(); } } QString PianoScene::noteName(const int note) { int num = (note + m_transpose + 12) % 12; int oct = m_baseOctave + ((note + m_transpose) / 12) - 1; if (m_noteNames.isEmpty()) { QString name; if (!m_names_f.isEmpty() && !m_names_s.isEmpty()) name = m_useFlats ? m_names_f.value(num) : m_names_s.value(num); return QString("%1%2").arg(name).arg(oct); } else { int noteIndex = note + m_transpose + 12*m_baseOctave; #if defined(SMALL_SCREEN) return m_noteNames.value(noteIndex); #else return QString("%1").arg(m_noteNames.value(noteIndex)); #endif } } void PianoScene::refreshLabels() { QListIterator it(m_labels); while(it.hasNext()) { KeyLabel* lbl = it.next(); PianoKey* key = dynamic_cast(lbl->parentItem()); if(key != NULL) { lbl->setHtml(noteName(key->getNote())); lbl->setVisible(m_showLabels); } } } void PianoScene::setShowLabels(bool show) { if (m_showLabels != show) { m_showLabels = show; refreshLabels(); } } void PianoScene::setUseFlats(bool use) { if (m_useFlats != use) { m_useFlats = use; refreshLabels(); } } void PianoScene::setTranspose(const int transpose) { if (m_transpose != transpose && transpose > -12 && transpose < 12) { m_transpose = transpose; hideOrShowKeys(); refreshLabels(); } } void PianoScene::setRawKeyboardMode(bool b) { if (m_rawkbd != b) { m_rawkbd = b; #if defined(RAWKBD_SUPPORT) RawKeybdApp* rapp = dynamic_cast(qApp); if (rapp != NULL) rapp->setRawKbdEnable(m_rawkbd); #endif } } void PianoScene::useCustomNoteNames(const QStringList& names) { m_noteNames = names; refreshLabels(); } void PianoScene::useStandardNoteNames() { m_noteNames.clear(); refreshLabels(); } void PianoScene::retranslate() { m_names_s.clear(); m_names_f.clear(); m_names_s << trUtf8("C") << trUtf8("C#") << trUtf8("D") << trUtf8("D#") << trUtf8("E") << trUtf8("F") << trUtf8("F#") << trUtf8("G") << trUtf8("G#") << trUtf8("A") << trUtf8("A#") << trUtf8("B"); m_names_f << trUtf8("C") << trUtf8("Db") << trUtf8("D") << trUtf8("Eb") << trUtf8("E") << trUtf8("F") << trUtf8("Gb") << trUtf8("G") << trUtf8("Ab") << trUtf8("A") << trUtf8("Bb") << trUtf8("B"); refreshLabels(); } vmpk-0.4.0/src/riffimportdlg.ui0000644000175000001440000001524711572642326015537 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ RiffImportDlg 0 0 391 215 Import SoundFont instruments :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png QFrame::StyledPanel QFrame::Raised Input File m_input true This text box displays the path and name of the selected SoundFont to be imported true 0 0 27 27 Press this button to select a SoundFont file to be imported ... Name Version Copyright Output File m_output This text box displays the name of the output file in .INS format that will be created 0 0 27 27 Press this button to select a path and file name for the output file ... QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox m_input m_inputBtn m_output m_outputBtn buttonBox accepted() RiffImportDlg accept() 226 168 452 122 buttonBox rejected() RiffImportDlg reject() 163 166 448 108 vmpk-0.4.0/src/shortcutdialog.ui0000644000175000001440000000576611572642326015727 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ ShortcutDialog 0 0 520 360 Keyboard Shortcuts :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png false false false true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows 3 Action Description Shortcut Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok ShortcutTable DialogButtonBox vmpk-0.4.0/src/pianoscene.h0000644000175000001440000001054211572642326014616 0ustar pedrousers/* Virtual Piano Widget for Qt4 Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef PIANOSCENE_H_ #define PIANOSCENE_H_ #include "pianokey.h" #include "keylabel.h" #include "keyboardmap.h" #include #include class PianoHandler { public: virtual ~PianoHandler() {} virtual void noteOn( const int note, const int vel ) = 0; virtual void noteOff( const int note, const int vel ) = 0; }; class VPIANO_EXPORT PianoScene : public QGraphicsScene { Q_OBJECT public: PianoScene ( const int baseOctave, const int numOctaves, const QColor& keyPressedColor = QColor(), QObject * parent = 0 ); QSize sizeHint() const; void setKeyboardMap( KeyboardMap* map ) { m_keybdMap = map; } KeyboardMap* getKeyboardMap() const { return m_keybdMap; } PianoHandler* getPianoHandler() const { return m_handler; } void setPianoHandler(PianoHandler* handler) { m_handler = handler; } QColor getKeyPressedColor() const { return m_keyPressedColor; } void setKeyPressedColor(const QColor& color); int getMinNote() const { return m_minNote; } void setMinNote(const int note); int getMaxNote() const { return m_maxNote; } void setMaxNote(const int note); int getTranspose() const { return m_transpose; } void setTranspose(const int transpose); bool showLabels() const { return m_showLabels; } void setShowLabels(const bool show); bool useFlats() const { return m_useFlats; } void setUseFlats(const bool use); void showNoteOn( const int note, int vel = -1 ); void showNoteOff( const int note, int vel = -1 ); int baseOctave() const { return m_baseOctave; } void setBaseOctave( const int base ); int numOctaves() const { return m_numOctaves; } void allKeysOff(); void keyOn( const int note ); void keyOff( const int note ); bool getRawKeyboardMode() const { return m_rawkbd; } void setRawKeyboardMode(const bool b); void useCustomNoteNames(const QStringList& names); void useStandardNoteNames(); int getVelocity() { return m_velocity; } void setVelocity(const int velocity) { m_velocity = velocity; } void retranslate(); signals: void noteOn(int n, int v); void noteOff(int n, int v); protected: void showKeyOn( PianoKey* key, int vel ); void showKeyOff( PianoKey* key, int vel ); void keyOn( PianoKey* key ); void keyOff( PianoKey* key ); void keyOn( PianoKey* key, qreal pressure ); void keyOff( PianoKey* key, qreal pressure ); PianoKey* getKeyForPos( const QPointF& p ) const; PianoKey* getPianoKey( const int key ) const; QString noteName(const int note); void mouseMoveEvent ( QGraphicsSceneMouseEvent * mouseEvent ); void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ); void mouseReleaseEvent ( QGraphicsSceneMouseEvent * mouseEvent ); void keyPressEvent ( QKeyEvent * keyEvent ); void keyReleaseEvent ( QKeyEvent * keyEvent ); bool event(QEvent *event); private: void hideOrShowKeys(); void refreshLabels(); void triggerNoteOn( const int note, const int vel ); void triggerNoteOff( const int note, const int vel ); int getNoteFromKey( const int key ) const; int m_baseOctave; int m_numOctaves; int m_minNote; int m_maxNote; int m_transpose; bool m_showLabels; bool m_useFlats; bool m_rawkbd; QColor m_keyPressedColor; bool m_mousePressed; int m_velocity; PianoHandler* m_handler; KeyboardMap* m_keybdMap; QList m_keys; QList m_labels; QStringList m_noteNames; QStringList m_names_s; QStringList m_names_f; }; #endif /*PIANOSCENE_H_*/ vmpk-0.4.0/src/midisetup.h0000644000175000001440000000326611572642326014502 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef MIDISETUP_H #define MIDISETUP_H #include "ui_midisetup.h" #include class MidiSetup : public QDialog { Q_OBJECT public: MidiSetup(QWidget *parent = 0); void inputNotAvailable(); bool inputIsEnabled() const; bool thruIsEnabled() const; void setInputEnabled(const bool state); void setThruEnabled(const bool state); void clearCombos(); void addInputPortName(const QString& name, int index); void addOutputPortName(const QString& output, int index); void setCurrentInput(int index); void setCurrentInput(const QString name); void setCurrentOutput(int index); void setCurrentOutput(const QString name); int selectedInput(); int selectedOutput(); QString selectedInputName() const; QString selectedOutputName() const; void retranslateUi(); public slots: void toggledInput(bool state); private: Ui::MidiSetupClass ui; }; #endif /* MIDISETUP_H */ vmpk-0.4.0/src/classicstyle.h0000644000175000001440000000402111572642326015167 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas Based on an original design by Thorsten Wilms. Implemented as a widget for the Rosegarden MIDI and audio sequencer and notation editor by Chris Cannam. Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas and adapted for use in QSynth. Ported to Qt4 by Chris Cannam. Adapted as a QStyle by Pedro Lopez-Cabanillas. For this file, the following copyright notices are also applicable: This file copyright 2003-2006 Chris Cannam, copyright 2005,2008 Pedro Lopez-Cabanillas, copyright 2006 Queen Mary, University of London. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef CLASSICTYLE_H_ #define CLASSICTYLE_H_ #include class ClassicStyle : public QCommonStyle { public: ClassicStyle() {}; virtual ~ClassicStyle() {}; virtual void drawPrimitive( PrimitiveElement pe, const QStyleOption *opt, QPainter *p, const QWidget *w ) const; virtual void drawComplexControl( ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget = 0) const; virtual int pixelMetric( PixelMetric metric, const QStyleOption* option=0, const QWidget *widget = 0 ) const; }; #endif /*CLASSICTYLE_H_*/ vmpk-0.4.0/src/shortcutdialog.cpp0000644000175000001440000002252311572642326016062 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas Copyright (C) 2005-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #include "shortcutdialog.h" #include #include #include #include #include #include #include #include //------------------------------------------------------------------------- // ShortcutTableItem class ShortcutTableItem : public QTableWidgetItem { public: // Constructors. ShortcutTableItem(const QIcon& icon, const QString& sText) : QTableWidgetItem(icon, sText) { setFlags(flags() & ~Qt::ItemIsEditable); } ShortcutTableItem(const QString& sText) : QTableWidgetItem(sText) { setFlags(flags() & ~Qt::ItemIsEditable); } ShortcutTableItem(const QKeySequence& shortcut) : QTableWidgetItem(QString(shortcut)) {} }; //------------------------------------------------------------------------- // ShortcutTableItemEdit class ShortcutTableItemEdit : public QLineEdit { public: // Constructor. ShortcutTableItemEdit(QWidget *pParent = NULL) : QLineEdit(pParent) {} protected: // Shortcut key to text event translation. void keyPressEvent(QKeyEvent *pKeyEvent) { int iKey = pKeyEvent->key(); Qt::KeyboardModifiers modifiers = pKeyEvent->modifiers(); if (iKey == Qt::Key_Return && modifiers == Qt::NoModifier) { emit editingFinished(); return; } if (iKey >= Qt::Key_Shift && iKey < Qt::Key_F1) { QLineEdit::keyPressEvent(pKeyEvent); return; } if (modifiers & Qt::ShiftModifier) iKey |= Qt::SHIFT; if (modifiers & Qt::ControlModifier) iKey |= Qt::CTRL; if (modifiers & Qt::AltModifier) iKey |= Qt::ALT; QLineEdit::setText(QString(QKeySequence(iKey))); } }; //------------------------------------------------------------------------- // ShortcutTableItemEditor ShortcutTableItemEditor::ShortcutTableItemEditor ( QWidget *pParent ) : QWidget(pParent) { m_pLineEdit = new ShortcutTableItemEdit(/*this*/); m_pToolButton = new QToolButton(/*this*/); m_pToolButton->setFixedWidth(18); m_pToolButton->setText("X"); QHBoxLayout *pLayout = new QHBoxLayout(); pLayout->setSpacing(0); pLayout->setMargin(0); pLayout->addWidget(m_pLineEdit); pLayout->addWidget(m_pToolButton); QWidget::setLayout(pLayout); QWidget::setFocusPolicy(Qt::StrongFocus); QWidget::setFocusProxy(m_pLineEdit); QObject::connect(m_pLineEdit, SIGNAL(editingFinished()), SLOT(finish())); QObject::connect(m_pToolButton, SIGNAL(clicked()), SLOT(clear())); } // Shortcut text accessors. void ShortcutTableItemEditor::setText ( const QString& sText ) { m_pLineEdit->setText(sText); } QString ShortcutTableItemEditor::text (void) const { return m_pLineEdit->text(); } // Shortcut text clear/toggler. void ShortcutTableItemEditor::clear (void) { if (m_pLineEdit->text() == m_sDefaultText) m_pLineEdit->clear(); else m_pLineEdit->setText(m_sDefaultText); m_pLineEdit->setFocus(); } // Shortcut text finish notification. void ShortcutTableItemEditor::finish (void) { emit editingFinished(); } //------------------------------------------------------------------------- // ShortcutTableItemDelegate ShortcutTableItemDelegate::ShortcutTableItemDelegate ( QTableWidget *pTableWidget ) : QItemDelegate(pTableWidget), m_pTableWidget(pTableWidget) { } // Overridden paint method. void ShortcutTableItemDelegate::paint ( QPainter *pPainter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { // Special treatment for action icon+text... if (index.column() == 0) { QTableWidgetItem *pItem = m_pTableWidget->item(index.row(), 0); pPainter->save(); if (option.state & QStyle::State_Selected) { const QPalette& pal = option.palette; pPainter->fillRect(option.rect, pal.highlight().color()); pPainter->setPen(pal.highlightedText().color()); } // Draw the icon... QRect rect = option.rect; const QSize& iconSize = m_pTableWidget->iconSize(); pPainter->drawPixmap(1, rect.top() + ((rect.height() - iconSize.height()) >> 1), pItem->icon().pixmap(iconSize)); // Draw the text... rect.setLeft(iconSize.width() + 2); pPainter->drawText(rect, Qt::TextShowMnemonic | Qt::AlignLeft | Qt::AlignVCenter, pItem->text()); pPainter->restore(); } else { // Others do as default... QItemDelegate::paint(pPainter, option, index); } } QWidget *ShortcutTableItemDelegate::createEditor ( QWidget *pParent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const { ShortcutTableItemEditor *pItemEditor = new ShortcutTableItemEditor(pParent); pItemEditor->setDefaultText( index.model()->data(index, Qt::DisplayRole).toString()); QObject::connect(pItemEditor, SIGNAL(editingFinished()), SLOT(commitEditor())); return pItemEditor; } void ShortcutTableItemDelegate::setEditorData ( QWidget *pEditor, const QModelIndex& index ) const { ShortcutTableItemEditor *pItemEditor = qobject_cast (pEditor); pItemEditor->setText( index.model()->data(index, Qt::DisplayRole).toString()); } void ShortcutTableItemDelegate::setModelData ( QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index ) const { ShortcutTableItemEditor *pItemEditor = qobject_cast (pEditor); pModel->setData(index, pItemEditor->text()); } void ShortcutTableItemDelegate::commitEditor (void) { ShortcutTableItemEditor *pItemEditor = qobject_cast (sender()); emit commitData(pItemEditor); emit closeEditor(pItemEditor); } //------------------------------------------------------------------------- // ShortcutDialog ShortcutDialog::ShortcutDialog ( QList actions, QWidget *pParent ) : QDialog(pParent) { // Setup UI struct... m_ui.setupUi(this); // Window modality (let plugin/tool windows rave around). QDialog::setWindowModality(Qt::ApplicationModal); m_iDirtyCount = 0; m_ui.ShortcutTable->setIconSize(QSize(16, 16)); m_ui.ShortcutTable->setItemDelegate( new ShortcutTableItemDelegate(m_ui.ShortcutTable)); m_ui.ShortcutTable->horizontalHeader()->setStretchLastSection(true); m_ui.ShortcutTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); m_ui.ShortcutTable->horizontalHeader()->resizeSection(0, 120); m_ui.ShortcutTable->horizontalHeader()->resizeSection(1, 260); int iRowHeight = m_ui.ShortcutTable->fontMetrics().height() + 4; m_ui.ShortcutTable->verticalHeader()->setDefaultSectionSize(iRowHeight); m_ui.ShortcutTable->verticalHeader()->hide(); int iRow = 0; QListIterator iter(actions); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) continue; m_ui.ShortcutTable->insertRow(iRow); m_ui.ShortcutTable->setItem(iRow, 0, new ShortcutTableItem(pAction->icon(), pAction->text())); m_ui.ShortcutTable->setItem(iRow, 1, new ShortcutTableItem(pAction->statusTip())); m_ui.ShortcutTable->setItem(iRow, 2, new ShortcutTableItem(pAction->shortcut())); m_actions.append(pAction); ++iRow; } QObject::connect(m_ui.ShortcutTable, SIGNAL(itemActivated(QTableWidgetItem *)), SLOT(actionActivated(QTableWidgetItem *))); QObject::connect(m_ui.ShortcutTable, SIGNAL(itemChanged(QTableWidgetItem *)), SLOT(actionChanged(QTableWidgetItem *))); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); } void ShortcutDialog::actionActivated ( QTableWidgetItem *pItem ) { m_ui.ShortcutTable->editItem(m_ui.ShortcutTable->item(pItem->row(), 2)); } void ShortcutDialog::actionChanged ( QTableWidgetItem *pItem ) { pItem->setText(QString(QKeySequence(pItem->text().trimmed()))); m_iDirtyCount++; } void ShortcutDialog::accept (void) { if (m_iDirtyCount > 0) { for (int iRow = 0; iRow < m_actions.count(); ++iRow) { QAction *pAction = m_actions[iRow]; pAction->setShortcut( QKeySequence(m_ui.ShortcutTable->item(iRow, 2)->text())); } } QDialog::accept(); } void ShortcutDialog::reject (void) { bool bReject = true; // Check if there's any pending changes... if (m_iDirtyCount > 0) { QMessageBox::StandardButtons buttons = QMessageBox::Discard | QMessageBox::Cancel; if (m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->isEnabled()) buttons |= QMessageBox::Apply; switch (QMessageBox::warning(this, tr("Warning"), tr("Keyboard shortcuts have been changed.\n\n" "Do you want to apply the changes?"), buttons)) { case QMessageBox::Apply: accept(); return; case QMessageBox::Discard: break; default: // Cancel. bReject = false; } } if (bReject) QDialog::reject(); } void ShortcutDialog::retranslateUi() { m_ui.retranslateUi(this); } // end of ShortcutDialog.cpp vmpk-0.4.0/src/midisetup.ui0000644000175000001440000001447411572642326014673 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ MidiSetupClass 0 0 420 151 420 0 MIDI Setup :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png Check this box to enable MIDI input for the program. In Linux and Mac OSX the input port is always enabled and can't be un-ckecked Enable MIDI input true Check this box to enable the MIDI Thru function: any MIDI event received in the input port will be copied unchanged to the output port Enable MIDI Thru on MIDI Output 0 0 Input MIDI Connection comboInput 0 0 180 0 Use this control to change the connection for the MIDI input port, if it is enabled 0 0 Output MIDI Connection comboOutput 0 0 180 0 Use this control to change the connection for the MIDI output port Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() MidiSetupClass accept() 236 160 157 141 buttonBox rejected() MidiSetupClass reject() 304 160 286 141 chkEnableInput toggled(bool) comboInput setEnabled(bool) 71 18 323 90 chkEnableInput toggled(bool) chkEnableThru setEnabled(bool) 212 17 193 44 vmpk-0.4.0/src/RtMidi.cpp0000644000175000001440000025674011572642326014231 0ustar pedrousers/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2011 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**********************************************************************/ // RtMidi: Version 1.0.14 #include "RtMidi.h" #include //*********************************************************************// // Common RtMidi Definitions //*********************************************************************// RtMidi :: RtMidi() : apiData_( 0 ), connected_( false ) { } void RtMidi :: error( RtError::Type type ) { if (type == RtError::WARNING) { std::cerr << '\n' << errorString_ << "\n\n"; } else if (type == RtError::DEBUG_WARNING) { #if defined(__RTMIDI_DEBUG__) std::cerr << '\n' << errorString_ << "\n\n"; #endif } else { std::cerr << '\n' << errorString_ << "\n\n"; throw RtError( errorString_, type ); } } //*********************************************************************// // Common RtMidiIn Definitions //*********************************************************************// RtMidiIn :: RtMidiIn( const std::string clientName ) : RtMidi() { this->initialize( clientName ); } void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::setCallback: a callback function is already set!"; error( RtError::WARNING ); return; } if ( !callback ) { errorString_ = "RtMidiIn::setCallback: callback function value is invalid!"; error( RtError::WARNING ); return; } inputData_.userCallback = (void *) callback; inputData_.userData = userData; inputData_.usingCallback = true; } void RtMidiIn :: cancelCallback() { if ( !inputData_.usingCallback ) { errorString_ = "RtMidiIn::cancelCallback: no callback function was set!"; error( RtError::WARNING ); return; } inputData_.userCallback = 0; inputData_.userData = 0; inputData_.usingCallback = false; } void RtMidiIn :: setQueueSizeLimit( unsigned int queueSize ) { inputData_.queueLimit = queueSize; } void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { inputData_.ignoreFlags = 0; if ( midiSysex ) inputData_.ignoreFlags = 0x01; if ( midiTime ) inputData_.ignoreFlags |= 0x02; if ( midiSense ) inputData_.ignoreFlags |= 0x04; } double RtMidiIn :: getMessage( std::vector *message ) { message->clear(); if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::getNextMessage: a user callback is currently set for this port."; error( RtError::WARNING ); return 0.0; } if ( inputData_.queue.size() == 0 ) return 0.0; // Copy queued message to the vector pointer argument and then "pop" it. std::vector *bytes = &(inputData_.queue.front().bytes); message->assign( bytes->begin(), bytes->end() ); double deltaTime = inputData_.queue.front().timeStamp; inputData_.queue.pop(); return deltaTime; } //*********************************************************************// // Common RtMidiOut Definitions //*********************************************************************// RtMidiOut :: RtMidiOut( const std::string clientName ) : RtMidi() { this->initialize( clientName ); } //*********************************************************************// // API: Macintosh OS-X //*********************************************************************// // API information found at: // - http://developer.apple.com/audio/pdf/coreaudio.pdf #if defined(__MACOSX_CORE__) // The CoreMIDI API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // OS-X CoreMIDI header files. #include #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct CoreMidiData { MIDIClientRef client; MIDIPortRef port; MIDIEndpointRef endpoint; MIDIEndpointRef destinationId; unsigned long long lastTime; MIDISysexSendRequest sysexreq; }; //*********************************************************************// // API: OS-X // Class Definitions: RtMidiIn //*********************************************************************// void midiInputCallback( const MIDIPacketList *list, void *procRef, void *srcRef ) { RtMidiIn::RtMidiInData *data = static_cast (procRef); CoreMidiData *apiData = static_cast (data->apiData); unsigned char status; unsigned short nBytes, iByte, size; unsigned long long time; bool& continueSysex = data->continueSysex; RtMidiIn::MidiMessage& message = data->message; const MIDIPacket *packet = &list->packet[0]; for ( unsigned int i=0; inumPackets; ++i ) { // My interpretation of the CoreMIDI documentation: all message // types, except sysex, are complete within a packet and there may // be several of them in a single packet. Sysex messages can be // broken across multiple packets and PacketLists but are bundled // alone within each packet (these packets do not contain other // message types). If sysex messages are split across multiple // MIDIPacketLists, they must be handled by multiple calls to this // function. nBytes = packet->length; if ( nBytes == 0 ) continue; // Calculate time stamp. message.timeStamp = 0.0; if ( data->firstMessage ) data->firstMessage = false; else { time = packet->timeStamp; if ( time == 0 ) { // this happens when receiving asynchronous sysex messages time = AudioGetCurrentHostTime(); } time -= apiData->lastTime; time = AudioConvertHostTimeToNanos( time ); message.timeStamp = time * 0.000000001; } apiData->lastTime = packet->timeStamp; if ( apiData->lastTime == 0 ) { // this happens when receiving asynchronous sysex messages apiData->lastTime = AudioGetCurrentHostTime(); } //std::cout << "TimeStamp = " << packet->timeStamp << std::endl; iByte = 0; if ( continueSysex ) { // We have a continuing, segmented sysex message. if ( !( data->ignoreFlags & 0x01 ) ) { // If we're not ignoring sysex messages, copy the entire packet. for ( unsigned int j=0; jdata[j] ); } continueSysex = packet->data[nBytes-1] != 0xF7; if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback && message.bytes.size() > 0 ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } else { while ( iByte < nBytes ) { size = 0; // We are expecting that the next byte in the packet is a status byte. status = packet->data[iByte]; if ( !(status & 0x80) ) break; // Determine the number of bytes in the MIDI message. if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status == 0xF0 ) { // A MIDI sysex if ( data->ignoreFlags & 0x01 ) { size = 0; iByte = nBytes; } else size = nBytes - iByte; continueSysex = packet->data[nBytes-1] != 0xF7; } else if ( status == 0xF1 ) { // A MIDI time code message if ( data->ignoreFlags & 0x02 ) { size = 0; iByte += 2; } else size = 2; } else if ( status == 0xF2 ) size = 3; else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 && ( data->ignoreFlags & 0x02 ) ) { // A MIDI timing tick message and we're ignoring it. size = 0; iByte += 1; } else if ( status == 0xFE && ( data->ignoreFlags & 0x04 ) ) { // A MIDI active sensing message and we're ignoring it. size = 0; iByte += 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &packet->data[iByte], &packet->data[iByte+size] ); if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } iByte += size; } } } packet = MIDIPacketNext(packet); } } void RtMidiIn :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "RtMidiIn::initialize: error creating OS-X MIDI client object."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = MIDIGetNumberOfSources(); if (nSrc < 1) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nSrc ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIInputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error creating OS-X MIDI input port."; error( RtError::DRIVER_ERROR ); } // Get the desired input source identifier. MIDIEndpointRef endpoint = MIDIGetSource( portNumber ); if ( endpoint == 0 ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error getting MIDI input source reference."; error( RtError::DRIVER_ERROR ); } // Make the connection. result = MIDIPortConnectSource( port, endpoint, NULL ); if ( result != noErr ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error connecting OS-X MIDI input port."; error( RtError::DRIVER_ERROR ); } // Save our api-specific port information. data->port = port; connected_ = true; } void RtMidiIn :: openVirtualPort( const std::string portName ) { CoreMidiData *data = static_cast (apiData_); // Create a virtual MIDI input destination. MIDIEndpointRef endpoint; OSStatus result = MIDIDestinationCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &endpoint ); if ( result != noErr ) { errorString_ = "RtMidiIn::openVirtualPort: error creating virtual OS-X MIDI destination."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->endpoint = endpoint; } void RtMidiIn :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } unsigned int RtMidiIn :: getPortCount() { return MIDIGetNumberOfSources(); } // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. CFStringRef EndpointName( MIDIEndpointRef endpoint, bool isExternal ) { CFMutableStringRef result = CFStringCreateMutable( NULL, 0 ); CFStringRef str; // Begin with the endpoint's name. str = NULL; MIDIObjectGetStringProperty( endpoint, kMIDIPropertyName, &str ); if ( str != NULL ) { CFStringAppend( result, str ); CFRelease( str ); } MIDIEntityRef entity = NULL; MIDIEndpointGetEntity( endpoint, &entity ); if ( entity == 0 ) // probably virtual return result; if ( CFStringGetLength( result ) == 0 ) { // endpoint name has zero length -- try the entity str = NULL; MIDIObjectGetStringProperty( entity, kMIDIPropertyName, &str ); if ( str != NULL ) { CFStringAppend( result, str ); CFRelease( str ); } } // now consider the device's name MIDIDeviceRef device = 0; MIDIEntityGetDevice( entity, &device ); if ( device == 0 ) return result; str = NULL; MIDIObjectGetStringProperty( device, kMIDIPropertyName, &str ); if ( CFStringGetLength( result ) == 0 ) { CFRelease( result ); return str; } if ( str != NULL ) { // if an external device has only one entity, throw away // the endpoint name and just use the device name if ( isExternal && MIDIDeviceGetNumberOfEntities( device ) < 2 ) { CFRelease( result ); return str; } else { if ( CFStringGetLength( str ) == 0 ) { CFRelease( str ); return result; } // does the entity name already start with the device name? // (some drivers do this though they shouldn't) // if so, do not prepend if ( CFStringCompareWithOptions( result, /* endpoint name */ str /* device name */, CFRangeMake(0, CFStringGetLength( str ) ), 0 ) != kCFCompareEqualTo ) { // prepend the device name to the entity name if ( CFStringGetLength( result ) > 0 ) CFStringInsert( result, 0, CFSTR(" ") ); CFStringInsert( result, 0, str ); } CFRelease( str ); } } return result; } // This function was submitted by Douglas Casey Tucker and apparently // derived largely from PortMidi. static CFStringRef ConnectedEndpointName( MIDIEndpointRef endpoint ) { CFMutableStringRef result = CFStringCreateMutable( NULL, 0 ); CFStringRef str; OSStatus err; int i; // Does the endpoint have connections? CFDataRef connections = NULL; int nConnected = 0; bool anyStrings = false; err = MIDIObjectGetDataProperty( endpoint, kMIDIPropertyConnectionUniqueID, &connections ); if ( connections != NULL ) { // It has connections, follow them // Concatenate the names of all connected devices nConnected = CFDataGetLength( connections ) / sizeof(MIDIUniqueID); if ( nConnected ) { const SInt32 *pid = (const SInt32 *)(CFDataGetBytePtr(connections)); for ( i=0; i= MIDIGetNumberOfSources() ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::WARNING ); //error( RtError::INVALID_PARAMETER ); return stringName; } portRef = MIDIGetSource( portNumber ); nameRef = ConnectedEndpointName(portRef); CFStringGetCString( nameRef, name, sizeof(name), 0); CFRelease( nameRef ); return stringName = name; } //*********************************************************************// // API: OS-X // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { return MIDIGetNumberOfDestinations(); } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; std::ostringstream ost; char name[128]; std::string stringName; if ( portNumber >= MIDIGetNumberOfDestinations() ) { ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::WARNING ); return stringName; //error( RtError::INVALID_PARAMETER ); } portRef = MIDIGetDestination( portNumber ); nameRef = ConnectedEndpointName(portRef); CFStringGetCString( nameRef, name, sizeof(name), 0); CFRelease( nameRef ); return stringName = name; } void RtMidiOut :: initialize( const std::string& clientName ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFStringCreateWithCString( NULL, clientName.c_str(), kCFStringEncodingASCII ), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "RtMidiOut::initialize: error creating OS-X MIDI client object."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nDest = MIDIGetNumberOfDestinations(); if (nDest < 1) { errorString_ = "RtMidiOut::openPort: no MIDI output destinations found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nDest ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIOutputPortCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "RtMidiOut::openPort: error creating OS-X MIDI output port."; error( RtError::DRIVER_ERROR ); } // Get the desired output port identifier. MIDIEndpointRef destination = MIDIGetDestination( portNumber ); if ( destination == 0 ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiOut::openPort: error getting MIDI output destination reference."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->port = port; data->destinationId = destination; connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { errorString_ = "RtMidiOut::openVirtualPort: a virtual output port already exists!"; error( RtError::WARNING ); return; } // Create a virtual MIDI output source. MIDIEndpointRef endpoint; OSStatus result = MIDISourceCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &endpoint ); if ( result != noErr ) { errorString_ = "RtMidiOut::initialize: error creating OS-X virtual MIDI source."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->endpoint = endpoint; } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } char *sysexBuffer = 0; void sysexCompletionProc( MIDISysexSendRequest * sreq ) { //std::cout << "Completed SysEx send\n"; delete sysexBuffer; sysexBuffer = 0; } void RtMidiOut :: sendMessage( std::vector *message ) { // We use the MIDISendSysex() function to asynchronously send sysex // messages. Otherwise, we use a single CoreMidi MIDIPacket. unsigned int nBytes = message->size(); if ( nBytes == 0 ) { errorString_ = "RtMidiOut::sendMessage: no data in message argument!"; error( RtError::WARNING ); return; } // unsigned int packetBytes, bytesLeft = nBytes; // unsigned int messageIndex = 0; MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); CoreMidiData *data = static_cast (apiData_); OSStatus result; if ( message->at(0) == 0xF0 ) { while ( sysexBuffer != 0 ) usleep( 1000 ); // sleep 1 ms sysexBuffer = new char[nBytes]; if ( sysexBuffer == NULL ) { errorString_ = "RtMidiOut::sendMessage: error allocating sysex message memory!"; error( RtError::MEMORY_ERROR ); } // Copy data to buffer. for ( unsigned int i=0; iat(i); data->sysexreq.destination = data->destinationId; data->sysexreq.data = (Byte *)sysexBuffer; data->sysexreq.bytesToSend = nBytes; data->sysexreq.complete = 0; data->sysexreq.completionProc = sysexCompletionProc; data->sysexreq.completionRefCon = &(data->sysexreq); result = MIDISendSysex( &(data->sysexreq) ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI to virtual destinations."; error( RtError::WARNING ); } return; } else if ( nBytes > 3 ) { errorString_ = "RtMidiOut::sendMessage: message format problem ... not sysex but > 3 bytes?"; error( RtError::WARNING ); return; } MIDIPacketList packetList; MIDIPacket *packet = MIDIPacketListInit( &packetList ); packet = MIDIPacketListAdd( &packetList, sizeof(packetList), packet, timeStamp, nBytes, (const Byte *) &message->at( 0 ) ); if ( !packet ) { errorString_ = "RtMidiOut::sendMessage: could not allocate packet list"; error( RtError::DRIVER_ERROR ); } // Send to any destinations that may have connected to us. if ( data->endpoint ) { result = MIDIReceived( data->endpoint, &packetList ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI to virtual destinations."; error( RtError::WARNING ); } } // And send to an explicit destination port if we're connected. if ( connected_ ) { result = MIDISend( data->port, data->destinationId, &packetList ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message to port."; error( RtError::WARNING ); } } } #endif // __MACOSX_CORE__ //*********************************************************************// // API: LINUX ALSA SEQUENCER //*********************************************************************// // API information found at: // - http://www.alsa-project.org/documentation.php#Library #if defined(__LINUX_ALSASEQ__) // The ALSA Sequencer API is based on the use of a callback function for // MIDI input. // // Thanks to Pedro Lopez-Cabanillas for help with the ALSA sequencer // time stamps and other assorted fixes!!! // If you don't need timestamping for incoming MIDI events, define the // preprocessor definition AVOID_TIMESTAMPING to save resources // associated with the ALSA sequencer queues. #include #include // ALSA header file. #include // A structure to hold variables related to the ALSA API // implementation. struct AlsaMidiData { snd_seq_t *seq; int vport; snd_seq_port_subscribe_t *subscription; snd_midi_event_t *coder; unsigned int bufferSize; unsigned char *buffer; pthread_t thread; unsigned long long lastTime; int queue_id; // an input queue is needed to get timestamped events }; #define PORT_TYPE( pinfo, bits ) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) //*********************************************************************// // API: LINUX ALSA // Class Definitions: RtMidiIn //*********************************************************************// extern "C" void *alsaMidiHandler( void *ptr ) { RtMidiIn::RtMidiInData *data = static_cast (ptr); AlsaMidiData *apiData = static_cast (data->apiData); long nBytes; unsigned long long time, lastTime; bool continueSysex = false; bool doDecode = false; RtMidiIn::MidiMessage message; snd_seq_event_t *ev; int result; apiData->bufferSize = 32; result = snd_midi_event_new( 0, &apiData->coder ); if ( result < 0 ) { data->doInput = false; std::cerr << "\nRtMidiIn::alsaMidiHandler: error initializing MIDI event parser!\n\n"; return 0; } unsigned char *buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; std::cerr << "\nRtMidiIn::alsaMidiHandler: error initializing buffer memory!\n\n"; return 0; } snd_midi_event_init( apiData->coder ); snd_midi_event_no_status( apiData->coder, 1 ); // suppress running status messages while ( data->doInput ) { if ( snd_seq_event_input_pending( apiData->seq, 1 ) == 0 ) { // No data pending ... sleep a bit. usleep( 1000 ); continue; } // If here, there should be data. result = snd_seq_event_input( apiData->seq, &ev ); if ( result == -ENOSPC ) { std::cerr << "\nRtMidiIn::alsaMidiHandler: MIDI input buffer overrun!\n\n"; continue; } else if ( result <= 0 ) { std::cerr << "RtMidiIn::alsaMidiHandler: unknown MIDI input error!\n"; continue; } // This is a bit weird, but we now have to decode an ALSA MIDI // event (back) into MIDI bytes. We'll ignore non-MIDI types. if ( !continueSysex ) message.bytes.clear(); doDecode = false; switch ( ev->type ) { case SND_SEQ_EVENT_PORT_SUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cout << "RtMidiIn::alsaMidiHandler: port connection made!\n"; #endif break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cerr << "RtMidiIn::alsaMidiHandler: port connection has closed!\n"; std::cout << "sender = " << (int) ev->data.connect.sender.client << ":" << (int) ev->data.connect.sender.port << ", dest = " << (int) ev->data.connect.dest.client << ":" << (int) ev->data.connect.dest.port << std::endl; #endif break; case SND_SEQ_EVENT_QFRAME: // MIDI time code if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_TICK: // MIDI timing tick if ( !( data->ignoreFlags & 0x02 ) ) doDecode = true; break; case SND_SEQ_EVENT_SENSING: // Active sensing if ( !( data->ignoreFlags & 0x04 ) ) doDecode = true; break; case SND_SEQ_EVENT_SYSEX: if ( (data->ignoreFlags & 0x01) ) break; if ( ev->data.ext.len > apiData->bufferSize ) { apiData->bufferSize = ev->data.ext.len; free( buffer ); buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; std::cerr << "\nRtMidiIn::alsaMidiHandler: error resizing buffer memory!\n\n"; break; } } default: doDecode = true; } if ( doDecode ) { nBytes = snd_midi_event_decode( apiData->coder, buffer, apiData->bufferSize, ev ); if ( nBytes > 0 ) { // The ALSA sequencer has a maximum buffer size for MIDI sysex // events of 256 bytes. If a device sends sysex messages larger // than this, they are segmented into 256 byte chunks. So, // we'll watch for this and concatenate sysex chunks into a // single sysex message if necessary. if ( !continueSysex ) message.bytes.assign( buffer, &buffer[nBytes] ); else message.bytes.insert( message.bytes.end(), buffer, &buffer[nBytes] ); continueSysex = ( ( ev->type == SND_SEQ_EVENT_SYSEX ) && ( message.bytes.back() != 0xF7 ) ); if ( !continueSysex ) { // Calculate the time stamp: message.timeStamp = 0.0; // Method 1: Use the system time. //(void)gettimeofday(&tv, (struct timezone *)NULL); //time = (tv.tv_sec * 1000000) + tv.tv_usec; // Method 2: Use the ALSA sequencer event time data. // (thanks to Pedro Lopez-Cabanillas!). time = ( ev->time.time.tv_sec * 1000000 ) + ( ev->time.time.tv_nsec/1000 ); lastTime = time; time -= apiData->lastTime; apiData->lastTime = lastTime; if ( data->firstMessage == true ) data->firstMessage = false; else message.timeStamp = time * 0.000001; } else { #if defined(__RTMIDI_DEBUG__) std::cerr << "\nRtMidiIn::alsaMidiHandler: event parsing error or not a MIDI event!\n\n"; #endif } } } snd_seq_free_event( ev ); if ( message.bytes.size() == 0 ) continue; if ( data->usingCallback && !continueSysex ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } } if ( buffer ) free( buffer ); snd_midi_event_free( apiData->coder ); apiData->coder = 0; return 0; } void RtMidiIn :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); if ( result < 0 ) { errorString_ = "RtMidiIn::initialize: error creating ALSA sequencer input client object."; error( RtError::DRIVER_ERROR ); } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->vport = -1; apiData_ = (void *) data; inputData_.apiData = (void *) data; // Create the input queue #ifndef AVOID_TIMESTAMPING data->queue_id = snd_seq_alloc_named_queue(seq, "RtMidi Queue"); // Set arbitrary tempo (mm=100) and resolution (240) snd_seq_queue_tempo_t *qtempo; snd_seq_queue_tempo_alloca(&qtempo); snd_seq_queue_tempo_set_tempo(qtempo, 600000); snd_seq_queue_tempo_set_ppq(qtempo, 240); snd_seq_set_queue_tempo(data->seq, data->queue_id, qtempo); snd_seq_drain_output(data->seq); #endif } // This function is used to count or get the pinfo structure for a given port number. unsigned int portInfo( snd_seq_t *seq, snd_seq_port_info_t *pinfo, unsigned int type, int portNumber ) { snd_seq_client_info_t *cinfo; int client; int count = 0; snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); while ( snd_seq_query_next_client( seq, cinfo ) >= 0 ) { client = snd_seq_client_info_get_client( cinfo ); if ( client == 0 ) continue; // Reset query info snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); while ( snd_seq_query_next_port( seq, pinfo ) >= 0 ) { unsigned int atyp = snd_seq_port_info_get_type( pinfo ); if ( ( atyp & SND_SEQ_PORT_TYPE_MIDI_GENERIC ) == 0 ) continue; unsigned int caps = snd_seq_port_info_get_capability( pinfo ); if ( ( caps & type ) != type ) continue; if ( count == portNumber ) return 1; ++count; } } // If a negative portNumber was used, return the port count. if ( portNumber < 0 ) return count; return 0; } void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); std::ostringstream ost; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) == 0 ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } snd_seq_addr_t sender, receiver; sender.client = snd_seq_port_info_get_client( pinfo ); sender.port = snd_seq_port_info_get_port( pinfo ); receiver.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { snd_seq_port_info_set_client( pinfo, 0 ); snd_seq_port_info_set_port( pinfo, 0 ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); #ifndef AVOID_TIMESTAMPING snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); #endif snd_seq_port_info_set_name(pinfo, portName.c_str() ); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "RtMidiIn::openPort: ALSA error creating input port."; error( RtError::DRIVER_ERROR ); } } receiver.port = data->vport; // Make subscription snd_seq_port_subscribe_malloc( &data->subscription ); snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { errorString_ = "RtMidiIn::openPort: ALSA error making port connection."; error( RtError::DRIVER_ERROR ); } if ( inputData_.doInput == false ) { // Start the input queue #ifndef AVOID_TIMESTAMPING snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); #ifndef AVOID_TIMESTAMPING snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); #endif snd_seq_port_info_set_name(pinfo, portName.c_str()); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "RtMidiIn::openVirtualPort: ALSA error creating virtual port."; error( RtError::DRIVER_ERROR ); } } if ( inputData_.doInput == false ) { // Start the input queue #ifndef AVOID_TIMESTAMPING snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } } void RtMidiIn :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); // Stop the input queue #ifndef AVOID_TIMESTAMPING snd_seq_stop_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); #endif connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Shutdown the input thread. AlsaMidiData *data = static_cast (apiData_); if ( inputData_.doInput ) { inputData_.doInput = false; pthread_join( data->thread, NULL ); } // Cleanup. if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); #ifndef AVOID_TIMESTAMPING snd_seq_free_queue( data->seq, data->queue_id ); #endif snd_seq_close( data->seq ); delete data; } unsigned int RtMidiIn :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, -1 ); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); std::string stringName; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client( pinfo ); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name( cinfo ); os << ":"; os << snd_seq_port_info_get_port( pinfo ); stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "RtMidiIn::getPortName: error looking for port name!"; error( RtError::WARNING ); return stringName; //error( RtError::INVALID_PARAMETER ); } //*********************************************************************// // API: LINUX ALSA // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, -1 ); } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { snd_seq_client_info_t *cinfo; snd_seq_port_info_t *pinfo; snd_seq_client_info_alloca( &cinfo ); snd_seq_port_info_alloca( &pinfo ); std::string stringName; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) ) { int cnum = snd_seq_port_info_get_client(pinfo); snd_seq_get_any_client_info( data->seq, cnum, cinfo ); std::ostringstream os; os << snd_seq_client_info_get_name(cinfo); os << ":"; os << snd_seq_port_info_get_port(pinfo); stringName = os.str(); return stringName; } // If we get here, we didn't find a match. errorString_ = "RtMidiOut::getPortName: error looking for port name!"; //error( RtError::INVALID_PARAMETER ); error( RtError::WARNING ); return stringName; } void RtMidiOut :: initialize( const std::string& clientName ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open( &seq, "default", SND_SEQ_OPEN_OUTPUT, SND_SEQ_NONBLOCK ); if ( result < 0 ) { errorString_ = "RtMidiOut::initialize: error creating ALSA sequencer client object."; error( RtError::DRIVER_ERROR ); } // Set client name. snd_seq_set_client_name( seq, clientName.c_str() ); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->vport = -1; data->bufferSize = 32; data->coder = 0; data->buffer = 0; result = snd_midi_event_new( data->bufferSize, &data->coder ); if ( result < 0 ) { delete data; errorString_ = "RtMidiOut::initialize: error initializing MIDI event parser!\n\n"; error( RtError::DRIVER_ERROR ); } data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { delete data; errorString_ = "RtMidiOut::initialize: error allocating buffer memory!\n\n"; error( RtError::MEMORY_ERROR ); } snd_midi_event_init( data->coder ); apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "RtMidiOut::openPort: no MIDI output sources found!"; error( RtError::NO_DEVICES_FOUND ); } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); std::ostringstream ost; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) == 0 ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } snd_seq_addr_t sender, receiver; receiver.client = snd_seq_port_info_get_client( pinfo ); receiver.port = snd_seq_port_info_get_port( pinfo ); sender.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION ); if ( data->vport < 0 ) { errorString_ = "RtMidiOut::openPort: ALSA error creating output port."; error( RtError::DRIVER_ERROR ); } } sender.port = data->vport; // Make subscription snd_seq_port_subscribe_malloc( &data->subscription ); snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); snd_seq_port_subscribe_set_time_update(data->subscription, 1); snd_seq_port_subscribe_set_time_real(data->subscription, 1); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { errorString_ = "RtMidiOut::openPort: ALSA error making port connection."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION ); if ( data->vport < 0 ) { errorString_ = "RtMidiOut::openVirtualPort: ALSA error creating virtual port."; error( RtError::DRIVER_ERROR ); } } } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. AlsaMidiData *data = static_cast (apiData_); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); if ( data->coder ) snd_midi_event_free( data->coder ); if ( data->buffer ) free( data->buffer ); snd_seq_close( data->seq ); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { int result; AlsaMidiData *data = static_cast (apiData_); unsigned int nBytes = message->size(); if ( nBytes > data->bufferSize ) { data->bufferSize = nBytes; result = snd_midi_event_resize_buffer ( data->coder, nBytes); if ( result != 0 ) { errorString_ = "RtMidiOut::sendMessage: ALSA error resizing MIDI event buffer."; error( RtError::DRIVER_ERROR ); } free (data->buffer); data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { errorString_ = "RtMidiOut::initialize: error allocating buffer memory!\n\n"; error( RtError::MEMORY_ERROR ); } } snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, data->vport); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); for ( unsigned int i=0; ibuffer[i] = message->at(i); result = snd_midi_event_encode( data->coder, data->buffer, (long)nBytes, &ev ); if ( result < (int)nBytes ) { errorString_ = "RtMidiOut::sendMessage: event parsing error!"; error( RtError::WARNING ); return; } // Send the event. result = snd_seq_event_output(data->seq, &ev); if ( result < 0 ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message to port."; error( RtError::WARNING ); } snd_seq_drain_output(data->seq); } #endif // __LINUX_ALSA__ //*********************************************************************// // API: IRIX MD //*********************************************************************// // API information gleamed from: // http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?cmd=getdoc&coll=0650&db=man&fname=3%20mdIntro // If the Makefile doesn't work, try the following: // CC -o midiinfo -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp midiinfo.cpp -lpthread -lmd // CC -o midiout -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp midiout.cpp -lpthread -lmd // CC -o qmidiin -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp qmidiin.cpp -lpthread -lmd // CC -o cmidiin -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp cmidiin.cpp -lpthread -lmd #if defined(__IRIX_MD__) #include #include #include // Irix MIDI header file. #include // A structure to hold variables related to the IRIX API // implementation. struct IrixMidiData { MDport port; pthread_t thread; }; //*********************************************************************// // API: IRIX // Class Definitions: RtMidiIn //*********************************************************************// extern "C" void *irixMidiHandler( void *ptr ) { RtMidiIn::RtMidiInData *data = static_cast (ptr); IrixMidiData *apiData = static_cast (data->apiData); bool continueSysex = false; unsigned char status; unsigned short size; MDevent event; int fd = mdGetFd( apiData->port ); if ( fd < 0 ) { data->doInput = false; std::cerr << "\nRtMidiIn::irixMidiHandler: error getting port descriptor!\n\n"; return 0; } fd_set mask, rmask; FD_ZERO( &mask ); FD_SET( fd, &mask ); struct timeval timeout = {0, 0}; RtMidiIn::MidiMessage message; int result; while ( data->doInput ) { rmask = mask; timeout.tv_sec = 0; timeout.tv_usec = 0; if ( select( fd+1, &rmask, NULL, NULL, &timeout ) <= 0 ) { // No data pending ... sleep a bit. usleep( 1000 ); continue; } // If here, there should be data. result = mdReceive( apiData->port, &event, 1); if ( result <= 0 ) { std::cerr << "\nRtMidiIn::irixMidiHandler: MIDI input read error!\n\n"; continue; } message.timeStamp = event.stamp * 0.000000001; size = 0; status = event.msg[0]; if ( !(status & 0x80) ) continue; if ( status == 0xF0 ) { // Sysex message ... can be segmented across multiple messages. if ( !(data->ignoreFlags & 0x01) ) { if ( continueSysex ) { // We have a continuing, segmented sysex message. Append // the new bytes to our existing message. for ( int i=0; iusingCallback && message.bytes.size() > 0 ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } } mdFree( NULL ); continue; } else if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status == 0xF1 && !(data->ignoreFlags & 0x02) ) { // A MIDI time code message and we're not ignoring it. size = 2; } else if ( status == 0xF2 ) size = 3; else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 ) { if ( !(data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're not ignoring it. size = 1; } } else if ( status == 0xFE ) { // MIDI active sensing if ( !(data->ignoreFlags & 0x04) ) size = 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &event.msg[0], &event.msg[size] ); // Invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } return 0; } void RtMidiIn :: initialize( const std::string& /*clientName*/ ) { // Initialize the Irix MIDI system. At the moment, we will not // worry about a return value of zero (ports) because there is a // chance the user could plug something in after instantiation. int nPorts = mdInit(); // Create our api-specific connection information. IrixMidiData *data = (IrixMidiData *) new IrixMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void RtMidiIn :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } int nPorts = mdInit(); if (nPorts < 1) { errorString_ = "RtMidiIn::openPort: no Irix MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } IrixMidiData *data = static_cast (apiData_); data->port = mdOpenInPort( mdGetName(portNumber) ); if ( data->port == NULL ) { ost << "RtMidiIn::openPort: Irix error opening the port (" << portNumber << ")."; errorString_ = ost.str(); error( RtError::DRIVER_ERROR ); } mdSetStampMode(data->port, MD_DELTASTAMP); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_RR); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, irixMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { mdClosePort( data->port ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Irix MIDI API. errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in Irix MIDI API!"; error( RtError::WARNING ); } void RtMidiIn :: closePort( void ) { if ( connected_ ) { IrixMidiData *data = static_cast (apiData_); mdClosePort( data->port ); connected_ = false; // Shutdown the input thread. inputData_.doInput = false; pthread_join( data->thread, NULL ); } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. IrixMidiData *data = static_cast (apiData_); delete data; } unsigned int RtMidiIn :: getPortCount() { int nPorts = mdInit(); if ( nPorts >= 0 ) return nPorts; else return 0; } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { int nPorts = mdInit(); std::string stringName; std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); //error( RtError::INVALID_PARAMETER ); error( RtError::WARNING ); } else std::string stringName = std::string( mdGetName( portNumber ) ); return stringName; } //*********************************************************************// // API: IRIX MD // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { int nPorts = mdInit(); if ( nPorts >= 0 ) return nPorts; else return 0; } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { int nPorts = mdInit(); std::string stringName; std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); //error( RtError::INVALID_PARAMETER ); error( RtError::WARNING ); } else std::string stringName = std::string( mdGetName( portNumber ) ); return stringName; } void RtMidiOut :: initialize( const std::string& /*clientName*/ ) { // Initialize the Irix MIDI system. At the moment, we will not // worry about a return value of zero (ports) because there is a // chance the user could plug something in after instantiation. int nPorts = mdInit(); // Create our api-specific connection information. IrixMidiData *data = (IrixMidiData *) new IrixMidiData; apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } int nPorts = mdInit(); if (nPorts < 1) { errorString_ = "RtMidiOut::openPort: no Irix MIDI output sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } IrixMidiData *data = static_cast (apiData_); data->port = mdOpenOutPort( mdGetName(portNumber) ); if ( data->port == NULL ) { ost << "RtMidiOut::openPort: Irix error opening the port (" << portNumber << ")."; errorString_ = ost.str(); error( RtError::DRIVER_ERROR ); } mdSetStampMode(data->port, MD_NOSTAMP); connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { IrixMidiData *data = static_cast (apiData_); mdClosePort( data->port ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Irix MIDI API. errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in Irix MIDI API!"; error( RtError::WARNING ); } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. IrixMidiData *data = static_cast (apiData_); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { int result; MDevent event; IrixMidiData *data = static_cast (apiData_); char *buffer = 0; unsigned int nBytes = message->size(); if ( nBytes == 0 ) return; event.stamp = 0; if ( message->at(0) == 0xF0 ) { if ( nBytes < 3 ) return; // check for bogus sysex event.msg[0] = 0xF0; event.msglen = nBytes; buffer = (char *) malloc( nBytes ); for ( int i=0; iat(i); event.sysexmsg = buffer; } else { for ( int i=0; iat(i); } // Send the event. result = mdSend( data->port, &event, 1 ); if ( buffer ) free( buffer ); if ( result < 1 ) { errorString_ = "RtMidiOut::sendMessage: IRIX error sending MIDI message!"; error( RtError::WARNING ); return; } } #endif // __IRIX_MD__ //*********************************************************************// // API: Windows Multimedia Library (MM) //*********************************************************************// // API information deciphered from: // - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_midi_reference.asp // Thanks to Jean-Baptiste Berruchon for the sysex code. #if defined(__WINDOWS_MM__) // The Windows MM API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // Windows MM MIDI header files. #include #include #define RT_SYSEX_BUFFER_SIZE 1024 #define RT_SYSEX_BUFFER_COUNT 4 // A structure to hold variables related to the CoreMIDI API // implementation. struct WinMidiData { HMIDIIN inHandle; // Handle to Midi Input Device HMIDIOUT outHandle; // Handle to Midi Output Device DWORD lastTime; RtMidiIn::MidiMessage message; LPMIDIHDR sysexBuffer[RT_SYSEX_BUFFER_COUNT]; }; //*********************************************************************// // API: Windows MM // Class Definitions: RtMidiIn //*********************************************************************// static void CALLBACK midiInputCallback( HMIDIIN hmin, UINT inputStatus, DWORD_PTR instancePtr, DWORD_PTR midiMessage, DWORD timestamp ) { if ( inputStatus != MIM_DATA && inputStatus != MIM_LONGDATA && inputStatus != MIM_LONGERROR ) return; //RtMidiIn::RtMidiInData *data = static_cast (instancePtr); RtMidiIn::RtMidiInData *data = (RtMidiIn::RtMidiInData *)instancePtr; WinMidiData *apiData = static_cast (data->apiData); // Calculate time stamp. apiData->message.timeStamp = 0.0; if ( data->firstMessage == true ) data->firstMessage = false; else apiData->message.timeStamp = (double) ( timestamp - apiData->lastTime ) * 0.001; apiData->lastTime = timestamp; if ( inputStatus == MIM_DATA ) { // Channel or system message // Make sure the first byte is a status byte. unsigned char status = (unsigned char) (midiMessage & 0x000000FF); if ( !(status & 0x80) ) return; // Determine the number of bytes in the MIDI message. unsigned short nBytes = 1; if ( status < 0xC0 ) nBytes = 3; else if ( status < 0xE0 ) nBytes = 2; else if ( status < 0xF0 ) nBytes = 3; else if ( status == 0xF1 ) { if ( data->ignoreFlags & 0x02 ) return; else nBytes = 2; } else if ( status == 0xF2 ) nBytes = 3; else if ( status == 0xF3 ) nBytes = 2; else if ( status == 0xF8 && (data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're ignoring it. return; } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. return; } // Copy bytes to our MIDI message. unsigned char *ptr = (unsigned char *) &midiMessage; for ( int i=0; imessage.bytes.push_back( *ptr++ ); } else { // Sysex message ( MIM_LONGDATA or MIM_LONGERROR ) MIDIHDR *sysex = ( MIDIHDR *) midiMessage; if ( !( data->ignoreFlags & 0x01 ) && inputStatus != MIM_LONGERROR ) { // Sysex message and we're not ignoring it for ( int i=0; i<(int)sysex->dwBytesRecorded; ++i ) apiData->message.bytes.push_back( sysex->lpData[i] ); } // The WinMM API requires that the sysex buffer be requeued after // input of each sysex message. Even if we are ignoring sysex // messages, we still need to requeue the buffer in case the user // decides to not ignore sysex messages in the future. However, // it seems that WinMM calls this function with an empty sysex // buffer when an application closes and in this case, we should // avoid requeueing it, else the computer suddenly reboots after // one or two minutes. if ( apiData->sysexBuffer[sysex->dwUser]->dwBytesRecorded > 0 ) { //if ( sysex->dwBytesRecorded > 0 ) { MMRESULT result = midiInAddBuffer( apiData->inHandle, apiData->sysexBuffer[sysex->dwUser], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) std::cerr << "\nRtMidiIn::midiInputCallback: error sending sysex to Midi device!!\n\n"; if ( data->ignoreFlags & 0x01 ) return; } else return; } if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( apiData->message.timeStamp, &apiData->message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( apiData->message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } // Clear the vector for the next input message. apiData->message.bytes.clear(); } void RtMidiIn :: initialize( const std::string& /*clientName*/ ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plugin something later. unsigned int nDevices = midiInGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "RtMidiIn::initialize: no MIDI input devices currently available."; error( RtError::WARNING ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; data->message.bytes.clear(); // needs to be empty for first input message } void RtMidiIn :: openPort( unsigned int portNumber, const std::string /*portName*/ ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nDevices = midiInGetNumDevs(); if (nDevices == 0) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nDevices ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiInOpen( &data->inHandle, portNumber, (DWORD_PTR)&midiInputCallback, (DWORD_PTR)&inputData_, CALLBACK_FUNCTION ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiIn::openPort: error creating Windows MM MIDI input port."; error( RtError::DRIVER_ERROR ); } // Allocate and init the sysex buffers. for ( int i=0; isysexBuffer[i] = (MIDIHDR*) new char[ sizeof(MIDIHDR) ]; data->sysexBuffer[i]->lpData = new char[ RT_SYSEX_BUFFER_SIZE ]; data->sysexBuffer[i]->dwBufferLength = RT_SYSEX_BUFFER_SIZE; data->sysexBuffer[i]->dwUser = i; // We use the dwUser parameter as buffer indicator data->sysexBuffer[i]->dwFlags = 0; result = midiInPrepareHeader( data->inHandle, data->sysexBuffer[i], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port (PrepareHeader)."; error( RtError::DRIVER_ERROR ); } // Register the buffer. result = midiInAddBuffer( data->inHandle, data->sysexBuffer[i], sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port (AddBuffer)."; error( RtError::DRIVER_ERROR ); } } result = midiInStart( data->inHandle ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtError::WARNING ); } void RtMidiIn :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiInReset( data->inHandle ); midiInStop( data->inHandle ); for ( int i=0; iinHandle, data->sysexBuffer[i], sizeof(MIDIHDR)); delete [] data->sysexBuffer[i]->lpData; delete [] data->sysexBuffer[i]; if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error closing Windows MM MIDI input port (midiInUnprepareHeader)."; error( RtError::DRIVER_ERROR ); } } midiInClose( data->inHandle ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } unsigned int RtMidiIn :: getPortCount() { return midiInGetNumDevs(); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { std::string stringName; unsigned int nDevices = midiInGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); //error( RtError::INVALID_PARAMETER ); error( RtError::WARNING ); return stringName; } MIDIINCAPS deviceCaps; midiInGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIINCAPS)); // For some reason, we need to copy character by character with // UNICODE (thanks to Eduardo Coutinho!). //std::string stringName = std::string( deviceCaps.szPname ); char nameString[MAXPNAMELEN]; for( int i=0; i= nDevices ) { std::ostringstream ost; ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); //error( RtError::INVALID_PARAMETER ); error( RtError::WARNING ); return stringName; } MIDIOUTCAPS deviceCaps; midiOutGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIOUTCAPS)); // For some reason, we need to copy character by character with // UNICODE (thanks to Eduardo Coutinho!). //std::string stringName = std::string( deviceCaps.szPname ); char nameString[MAXPNAMELEN]; for( int i=0; i= nDevices ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiOutOpen( &data->outHandle, portNumber, (DWORD)NULL, (DWORD)NULL, CALLBACK_NULL ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiOut::openPort: error creating Windows MM MIDI output port."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiOutReset( data->outHandle ); midiOutClose( data->outHandle ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtError::WARNING ); } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { unsigned int nBytes = static_cast(message->size()); if ( nBytes == 0 ) { errorString_ = "RtMidiOut::sendMessage: message argument is empty!"; error( RtError::WARNING ); return; } MMRESULT result; WinMidiData *data = static_cast (apiData_); if ( message->at(0) == 0xF0 ) { // Sysex message // Allocate buffer for sysex data. char *buffer = (char *) malloc( nBytes ); if ( buffer == NULL ) { errorString_ = "RtMidiOut::sendMessage: error allocating sysex message memory!"; error( RtError::MEMORY_ERROR ); } // Copy data to buffer. for ( unsigned int i=0; iat(i); // Create and prepare MIDIHDR structure. MIDIHDR sysex; sysex.lpData = (LPSTR) buffer; sysex.dwBufferLength = nBytes; sysex.dwFlags = 0; result = midiOutPrepareHeader( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "RtMidiOut::sendMessage: error preparing sysex header."; error( RtError::DRIVER_ERROR ); } // Send the message. result = midiOutLongMsg( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "RtMidiOut::sendMessage: error sending sysex message."; error( RtError::DRIVER_ERROR ); } // Unprepare the buffer and MIDIHDR. while ( MIDIERR_STILLPLAYING == midiOutUnprepareHeader( data->outHandle, &sysex, sizeof (MIDIHDR) ) ) Sleep( 1 ); free( buffer ); } else { // Channel or system message. // Make sure the message size isn't too big. if ( nBytes > 3 ) { errorString_ = "RtMidiOut::sendMessage: message size is greater than 3 bytes (and not sysex)!"; error( RtError::WARNING ); return; } // Pack MIDI bytes into double word. DWORD packet; unsigned char *ptr = (unsigned char *) &packet; for ( unsigned int i=0; iat(i); ++ptr; } // Send the message immediately. result = midiOutShortMsg( data->outHandle, packet ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message."; error( RtError::DRIVER_ERROR ); } } } #endif // __WINDOWS_MM__ //*********************************************************************// // API: LINUX JACK // // Written primarily by Alexander Svetalkin, with updates for delta // time by Gary Scavone, April 2011. // // *********************************************************************// #if defined(__LINUX_JACK__) // JACK header files #include #include #include #define JACK_RINGBUFFER_SIZE 16384 // Default size for ringbuffer struct JackMidiData { jack_client_t *client; jack_port_t *port; jack_ringbuffer_t *buffSize; jack_ringbuffer_t *buffMessage; jack_time_t lastTime; }; struct Arguments { JackMidiData *jackData; RtMidiIn :: RtMidiInData *rtMidiIn; }; //*********************************************************************// // API: JACK // Class Definitions: RtMidiIn //*********************************************************************// int jackProcessIn( jack_nframes_t nframes, void *arg ) { JackMidiData *jData = ( (Arguments *) arg )->jackData; RtMidiIn :: RtMidiInData *rtData = ( (Arguments *) arg )->rtMidiIn; jack_midi_event_t event; jack_time_t long long time; // Is port created? if ( jData->port == NULL ) return 0; void *buff = jack_port_get_buffer( jData->port, nframes ); // We have midi events in buffer int evCount = jack_midi_get_event_count( buff ); if ( evCount > 0 ) { RtMidiIn::MidiMessage message; message.bytes.clear(); jack_midi_event_get( &event, buff, 0 ); for (unsigned int i = 0; i < event.size; i++ ) message.bytes.push_back( event.buffer[i] ); // Compute the delta time. time = jack_get_time(); if ( rtData->firstMessage == true ) rtData->firstMessage = false; else message.timeStamp = ( time - jData->lastTime ) * 0.000001; jData->lastTime = time; if ( rtData->usingCallback && !rtData->continueSysex ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) rtData->userCallback; callback( message.timeStamp, &message.bytes, rtData->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( rtData->queueLimit > rtData->queue.size() ) rtData->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } } return 0; } void RtMidiIn :: initialize( const std::string& clientName ) { JackMidiData *data = new JackMidiData; // Initialize JACK client if (( data->client = jack_client_open( clientName.c_str(), JackNullOption, NULL )) == 0) { errorString_ = "RtMidiOut::initialize: JACK server not running?"; error( RtError::DRIVER_ERROR ); return; } Arguments *arg = new Arguments; arg->jackData = data; arg->rtMidiIn = &inputData_; jack_set_process_callback( data->client, jackProcessIn, arg ); data->port = NULL; jack_activate( data->client ); apiData_ = (void *) data; } RtMidiIn :: ~RtMidiIn() { JackMidiData *data = static_cast (apiData_); jack_client_close( data->client ); } void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { JackMidiData *data = static_cast (apiData_); // Creating new port if ( data->port == NULL) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); if ( data->port == NULL) { errorString_ = "RtMidiOut::openVirtualPort: JACK error creating virtual port"; error( RtError::DRIVER_ERROR ); } // Connecting to the output std::string name = getPortName( portNumber ); jack_connect( data->client, name.c_str(), jack_port_name( data->port ) ); } void RtMidiIn :: openVirtualPort( const std::string portName ) { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); if ( data->port == NULL ) { errorString_ = "RtMidiOut::openVirtualPort: JACK error creating virtual port"; error( RtError::DRIVER_ERROR ); } } unsigned int RtMidiIn :: getPortCount() { int count = 0; JackMidiData *data = static_cast (apiData_); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput ); if ( ports == NULL ) return 0; while ( ports[count] != NULL ) count++; free( ports ); return count; } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { JackMidiData *data = static_cast (apiData_); std::ostringstream ost; std::string retStr(""); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput ); // Check port validity if ( ports == NULL ) { errorString_ = "RtMidiOut::getPortName: no ports available!"; error( RtError::WARNING ); return retStr; } if ( ports[portNumber] == NULL ) { ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::WARNING ); } else retStr.assign( ports[portNumber] ); free( ports ); return retStr; } void RtMidiIn :: closePort() { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) return; jack_port_unregister( data->client, data->port ); } //*********************************************************************// // API: JACK // Class Definitions: RtMidiOut //*********************************************************************// // Jack process callback int jackProcessOut( jack_nframes_t nframes, void *arg ) { JackMidiData *data = (JackMidiData *) arg; jack_midi_data_t *midiData; int space; // Is port created? if ( data->port == NULL ) return 0; void *buff = jack_port_get_buffer( data->port, nframes ); jack_midi_clear_buffer( buff ); while ( jack_ringbuffer_read_space( data->buffSize ) > 0 ) { jack_ringbuffer_read( data->buffSize, (char *) &space, (size_t) sizeof(space) ); midiData = jack_midi_event_reserve( buff, 0, space ); jack_ringbuffer_read( data->buffMessage, (char *) midiData, (size_t) space ); } return 0; } void RtMidiOut :: initialize( const std::string& clientName ) { JackMidiData *data = new JackMidiData; // Initialize JACK client if (( data->client = jack_client_open( clientName.c_str(), JackNullOption, NULL )) == 0) { errorString_ = "RtMidiOut::initialize: JACK server not running?"; error( RtError::DRIVER_ERROR ); return; } jack_set_process_callback( data->client, jackProcessOut, data ); data->buffSize = jack_ringbuffer_create( JACK_RINGBUFFER_SIZE ); data->buffMessage = jack_ringbuffer_create( JACK_RINGBUFFER_SIZE ); jack_activate( data->client ); data->port = NULL; apiData_ = (void *) data; } RtMidiOut :: ~RtMidiOut() { JackMidiData *data = static_cast (apiData_); // Cleanup jack_client_close( data->client ); jack_ringbuffer_free( data->buffSize ); jack_ringbuffer_free( data->buffMessage ); } void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { JackMidiData *data = static_cast (apiData_); // Creating new port if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0 ); if ( data->port == NULL ) { errorString_ = "RtMidiOut::openVirtualPort: JACK error creating virtual port"; error( RtError::DRIVER_ERROR ); } // Connecting to the output std::string name = getPortName( portNumber ); jack_connect( data->client, jack_port_name( data->port ), name.c_str() ); } void RtMidiOut :: openVirtualPort( const std::string portName ) { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) data->port = jack_port_register( data->client, portName.c_str(), JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0 ); if ( data->port == NULL ) { errorString_ = "RtMidiOut::openVirtualPort: JACK error creating virtual port"; error( RtError::DRIVER_ERROR ); } } unsigned int RtMidiOut :: getPortCount() { int count = 0; JackMidiData *data = static_cast (apiData_); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput ); if ( ports == NULL ) return 0; while ( ports[count] != NULL ) count++; free( ports ); return count; } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { JackMidiData *data = static_cast (apiData_); std::ostringstream ost; std::string retStr(""); // List of available ports const char **ports = jack_get_ports( data->client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput ); // Check port validity if ( ports == NULL) { errorString_ = "RtMidiOut::getPortName: no ports available!"; error( RtError::WARNING ); return retStr; } if ( ports[portNumber] == NULL) { ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::WARNING ); } else retStr.assign( ports[portNumber] ); free( ports ); return retStr; } void RtMidiOut :: closePort() { JackMidiData *data = static_cast (apiData_); if ( data->port == NULL ) return; jack_port_unregister( data->client, data->port ); data->port = NULL; } void RtMidiOut :: sendMessage( std::vector *message ) { int nBytes = message->size(); JackMidiData *data = static_cast (apiData_); // Write full message to buffer jack_ringbuffer_write( data->buffMessage, ( const char * ) &( *message )[0], message->size() ); jack_ringbuffer_write( data->buffSize, ( char * ) &nBytes, sizeof( nBytes ) ); } #endif // __LINUX_JACK__ vmpk-0.4.0/src/qticonloader.cpp0000644000175000001440000004132011572642326015507 0ustar pedrousers/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include "qticonloader.h" #include #include #include #include #include #include #include #include #ifdef Q_WS_X11 extern "C" { struct GConfClient; struct GError; typedef void (*Ptr_g_type_init)(); typedef GConfClient* (*Ptr_gconf_client_get_default)(); typedef char* (*Ptr_gconf_client_get_string)(GConfClient*, const char*, GError **); typedef void (*Ptr_g_object_unref)(void *); typedef void (*Ptr_g_error_free)(GError *); typedef void (*Ptr_g_free)(void*); static Ptr_g_type_init p_g_type_init = 0; static Ptr_gconf_client_get_default p_gconf_client_get_default = 0; static Ptr_gconf_client_get_string p_gconf_client_get_string = 0; static Ptr_g_object_unref p_g_object_unref = 0; static Ptr_g_error_free p_g_error_free = 0; static Ptr_g_free p_g_free = 0; } static int kdeVersion() { static int version = qgetenv("KDE_SESSION_VERSION").toInt(); return version; } static QString kdeHome() { static QString kdeHomePath; if (kdeHomePath.isEmpty()) { kdeHomePath = QFile::decodeName(qgetenv("KDEHOME")); if (kdeHomePath.isEmpty()) { int kdeSessionVersion = kdeVersion(); QDir homeDir(QDir::homePath()); QString kdeConfDir(QLatin1String("/.kde")); if (4 == kdeSessionVersion && homeDir.exists(QLatin1String(".kde4"))) kdeConfDir = QLatin1String("/.kde4"); kdeHomePath = QDir::homePath() + kdeConfDir; } } return kdeHomePath; } static QString systemThemeName() { QString themeName; #ifdef Q_WS_X11 // If we are running GNOME we resolve and use GConf. In all other // cases we currently use the KDE icon theme if (qgetenv("DESKTOP_SESSION") == "gnome" || !qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty()) { if (themeName.isEmpty()) { // Resolve glib and gconf p_g_type_init = (Ptr_g_type_init)QLibrary::resolve(QLatin1String("gobject-2.0"), 0, "g_type_init"); p_gconf_client_get_default = (Ptr_gconf_client_get_default)QLibrary::resolve(QLatin1String("gconf-2"), 4, "gconf_client_get_default"); p_gconf_client_get_string = (Ptr_gconf_client_get_string)QLibrary::resolve(QLatin1String("gconf-2"), 4, "gconf_client_get_string"); p_g_object_unref = (Ptr_g_object_unref)QLibrary::resolve(QLatin1String("gobject-2.0"), 0, "g_object_unref"); p_g_error_free = (Ptr_g_error_free)QLibrary::resolve(QLatin1String("glib-2.0"), 0, "g_error_free"); p_g_free = (Ptr_g_free)QLibrary::resolve(QLatin1String("glib-2.0"), 0, "g_free"); if (p_g_type_init && p_gconf_client_get_default && p_gconf_client_get_string && p_g_object_unref && p_g_error_free && p_g_free) { p_g_type_init(); GConfClient* client = p_gconf_client_get_default(); GError *err = 0; char *str = p_gconf_client_get_string(client, "/desktop/gnome/interface/icon_theme", &err); if (!err) { themeName = QString::fromUtf8(str); p_g_free(str); } p_g_object_unref(client); if (err) p_g_error_free (err); } if (themeName.isEmpty()) themeName = QLatin1String("gnome"); } if (!themeName.isEmpty()) return themeName; } QStringList kdeDirs = QFile::decodeName(getenv("KDEDIRS")).split(QLatin1Char(':')); bool kde4 = kdeVersion() >= 4; QString defaultPath = kde4 ? QLatin1String("/usr/share/icons/default.kde4") : QLatin1String("/usr/share/icons/default.kde"); QFileInfo fileInfo(defaultPath); QDir dir(fileInfo.canonicalFilePath()); QString kdeDefault = kde4 ? QString::fromLatin1("oxygen") : QString::fromLatin1("crystalsvg"); QString defaultTheme = fileInfo.exists() ? dir.dirName() : kdeDefault; QSettings settings(kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); settings.beginGroup(QLatin1String("Icons")); themeName = settings.value(QLatin1String("Theme"), defaultTheme).toString(); #endif return themeName; } struct QIconDirInfo { enum Type { Fixed, Scalable, Threshold }; QIconDirInfo(const QString &_path = QString()) : path(_path), size(0), maxSize(0), minSize(0), threshold(0), type(Threshold) {} QString path; short size; short maxSize; short minSize; short threshold; Type type : 4; }; class QIconLoaderEngineEntry { public: virtual ~QIconLoaderEngineEntry() {} QString filename; QIconDirInfo dir; static int count; }; struct ScalableEntry : public QIconLoaderEngineEntry { QIcon svgIcon; }; struct PixmapEntry : public QIconLoaderEngineEntry { QPixmap basePixmap; }; typedef QList QThemeIconEntries; class QIconTheme { public: QIconTheme(const QString &name); QIconTheme() : m_valid(false) {}; QStringList parents() { return m_parents; } QList keyList() { return m_keyList; } QString contentDir() { return m_contentDir; } bool isValid() { return m_valid; } private: QString m_contentDir; QList m_keyList; QStringList m_parents; bool m_valid; }; class QtIconLoaderImplementation { public: QtIconLoaderImplementation(); QIcon loadIcon(const QString &name); private: QString themeName() const { return m_userTheme.isEmpty() ? m_systemTheme : m_userTheme; } QThemeIconEntries findIconHelper(const QString &themeName, const QString &iconName, QStringList &visited) const; uint m_themeKey; bool m_supportsSvg; mutable QString m_userTheme; mutable QString m_systemTheme; mutable QStringList m_iconDirs; mutable QHash themeList; }; Q_GLOBAL_STATIC(QtIconLoaderImplementation, iconLoaderInstance) /*! Returns the standard icon for the given icon /a name as specified in the freedesktop icon spec http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html /a fallback is an optional argument to specify the icon to be used if no icon is found on the platform. This is particularily useful for crossplatform code. */ QIcon QtIconLoaderImplementation::loadIcon(const QString &name) { QIcon icon; QString theme = themeName(); if (!theme.isEmpty()) { QStringList visited; QThemeIconEntries entries = findIconHelper(theme, name, visited); for (int i = 0; i < entries.size() ; ++i) { int size = entries.at(i)->dir.size; icon.addFile(entries.at(i)->filename, QSize(size, size), QIcon::Normal, QIcon::Off); } } return icon; } QtIconLoaderImplementation::QtIconLoaderImplementation() { m_systemTheme = systemThemeName(); /* QFactoryLoader iconFactoryLoader(QIconEngineFactoryInterfaceV2_iid, QLatin1String("/iconengines"), Qt::CaseInsensitive); if (iconFactoryLoader.keys().contains(QLatin1String("svg"))) */ m_supportsSvg = false; } static QString fallbackTheme() { QString defaultTheme = systemThemeName(); if (defaultTheme.isEmpty()) defaultTheme = QLatin1String("hicolor"); return defaultTheme; } static QStringList themeSearchPaths() { QStringList iconDirs; if (iconDirs.isEmpty()) { #if defined(Q_WS_X11) QString xdgDirString = QFile::decodeName(getenv("XDG_DATA_DIRS")); if (xdgDirString.isEmpty()) xdgDirString = QLatin1String("/usr/local/share/:/usr/share/"); QStringList xdgDirs = xdgDirString.split(QLatin1Char(':')); for (int i = 0 ; i < xdgDirs.size() ; ++i) { QDir dir(xdgDirs[i]); if (dir.exists()) iconDirs.append(dir.path() + QLatin1String("/icons")); } if (kdeVersion() != 0) { iconDirs << QLatin1Char(':') + kdeHome() + QLatin1String("/share/icons"); QStringList kdeDirs = QFile::decodeName(getenv("KDEDIRS")).split(QLatin1Char(':')); for (int i = 0 ; i< kdeDirs.count() ; ++i) { QDir dir(QLatin1Char(':') + kdeDirs.at(i) + QLatin1String("/share/icons")); if (dir.exists()) iconDirs.append(dir.path()); } } // Add home directory first in search path QDir homeDir(QDir::homePath() + QLatin1String("/.icons")); if (homeDir.exists()) iconDirs.prepend(homeDir.path()); #elif defined(Q_WS_WIN) m_iconDirs.append(qApp->applicationDirPath() + QLatin1String("/icons")); #elif defined(Q_WS_MAC) m_iconDirs.append(qApp->applicationDirPath() + QLatin1String("/../Resources/icons")); #endif } return iconDirs; } QIconTheme::QIconTheme(const QString &themeName) : m_valid(false) { QFile themeIndex; QList keyList; QStringList iconDirs = themeSearchPaths(); for ( int i = 0 ; i < iconDirs.size() ; ++i) { QDir iconDir(iconDirs[i]); QString themeDir = iconDir.path() + QLatin1Char('/') + themeName; themeIndex.setFileName(themeDir + QLatin1String("/index.theme")); if (themeIndex.exists()) { m_contentDir = themeDir; m_valid = true; break; } } if (themeIndex.exists()) { const QSettings indexReader(themeIndex.fileName(), QSettings::IniFormat); QStringListIterator keyIterator(indexReader.allKeys()); while (keyIterator.hasNext()) { const QString key = keyIterator.next(); if (key.endsWith(QLatin1String("/Size"))) { // Note the QSettings ini-format does not accept // slashes in key names, hence we have to cheat if (int size = indexReader.value(key).toInt()) { QString directoryKey = key.left(key.size() - 5); QIconDirInfo dirInfo(directoryKey); dirInfo.size = size; QString type = indexReader.value(directoryKey + QLatin1String("/Type") ).toString(); if (type == QLatin1String("Fixed")) dirInfo.type = QIconDirInfo::Fixed; else if (type == QLatin1String("Scalable")) dirInfo.type = QIconDirInfo::Scalable; else dirInfo.type = QIconDirInfo::Threshold; dirInfo.threshold = indexReader.value(directoryKey + QLatin1String("/Threshold"), 2).toInt(); dirInfo.minSize = indexReader.value(directoryKey + QLatin1String("/MinSize"), size).toInt(); dirInfo.maxSize = indexReader.value(directoryKey + QLatin1String("/MaxSize"), size).toInt(); m_keyList.append(dirInfo); } } } // Parent themes provide fallbacks for missing icons m_parents = indexReader.value( QLatin1String("Icon Theme/Inherits")).toStringList(); // Ensure a default platform fallback for all themes if (m_parents.isEmpty()) m_parents.append(fallbackTheme()); // Ensure that all themes fall back to hicolor if (!m_parents.isEmpty()) m_parents.append(QLatin1String("hicolor")); } } QThemeIconEntries QtIconLoaderImplementation::findIconHelper(const QString &themeName, const QString &iconName, QStringList &visited) const { QThemeIconEntries entries; Q_ASSERT(!themeName.isEmpty()); QPixmap pixmap; // Used to protect against potential recursions visited << themeName; QIconTheme theme = themeList.value(themeName); if (!theme.isValid()) { theme = QIconTheme(themeName); if (!theme.isValid()) theme = fallbackTheme(); themeList.insert(themeName, theme); } QString contentDir = theme.contentDir() + QLatin1Char('/'); QList subDirs = theme.keyList(); const QString svgext(QLatin1String(".svg")); const QString pngext(QLatin1String(".png")); // Add all relevant files for (int i = 0; i < subDirs.size() ; ++i) { const QIconDirInfo &dirInfo = subDirs.at(i); QString subdir = dirInfo.path; QDir currentDir(contentDir + subdir); if (dirInfo.type == QIconDirInfo::Scalable && m_supportsSvg && currentDir.exists(iconName + svgext)) { ScalableEntry *iconEntry = new ScalableEntry; iconEntry->dir = dirInfo; iconEntry->filename = currentDir.filePath(iconName + svgext); entries.append(iconEntry); } else if (currentDir.exists(iconName + pngext)) { PixmapEntry *iconEntry = new PixmapEntry; iconEntry->dir = dirInfo; iconEntry->filename = currentDir.filePath(iconName + pngext); // Notice we ensure that pixmap entries allways come before // scalable to preserve search order afterwards entries.prepend(iconEntry); } } if (entries.isEmpty()) { const QStringList parents = theme.parents(); // Search recursively through inherited themes for (int i = 0 ; i < parents.size() ; ++i) { const QString parentTheme = parents.at(i).trimmed(); if (!visited.contains(parentTheme)) // guard against recursion entries = findIconHelper(parentTheme, iconName, visited); if (!entries.isEmpty()) // success break; } } return entries; } #endif //Q_WS_X11 QIcon QtIconLoader::icon(const QString &name, const QIcon &fallback) { QIcon icon; #ifdef Q_WS_X11 icon = iconLoaderInstance()->loadIcon(name); #endif //Q_WS_X11 if (icon.isNull()) icon = fallback; Q_UNUSED(name); return icon; } vmpk-0.4.0/src/vpiano.h0000644000175000001440000001644111572642326013772 0ustar pedrousers/* MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see . */ #ifndef VPIANO_H #define VPIANO_H #include "ui_vpiano.h" #include "pianoscene.h" #include class QTranslator; class QLabel; class QComboBox; class QSpinBox; class QSlider; class QStyle; class Knob; class Instrument; class RtMidiIn; class RtMidiOut; class About; class Preferences; class MidiSetup; class KMapDialog; class DialogExtraControls; class RiffImportDlg; class VPiano : public QMainWindow, public PianoHandler { Q_OBJECT public: VPiano( QWidget * parent = 0, Qt::WindowFlags flags = 0 ); virtual ~VPiano(); int getInputChannel(); void midiThru(std::vector *message) const; bool isInitialized() const { return m_initialized; } void retranslateUi(); QMenu *createPopupMenu (); // PianoHandler methods void noteOn(const int midiNote, const int vel); void noteOff(const int midiNote, const int vel); // static methods static QString dataDirectory(); static QString localeDirectory(); #if ENABLE_DBUS public Q_SLOTS: void quit(); void panic(); void reset_controllers(); void channel(int value); void octave(int value); void transpose(int value); void velocity(int value); void connect_in(const QString &value); void connect_out(const QString &value); void connect_thru(bool value); void noteoff(int note); void noteon(int note); void polykeypress(int note, int value); void controlchange(int control, int value); void programchange(int value); void programnamechange(const QString &value); void chankeypress(int value); void pitchwheel(int value); Q_SIGNALS: void event_noteoff(int note); void event_noteon(int note); void event_polykeypress(int note, int value); void event_controlchange(int control, int value); void event_programchange(int value); void event_chankeypress(int value); void event_pitchwheel(int value); #endif /*ENABLE_DBUS*/ protected Q_SLOTS: void slotAbout(); void slotAboutQt(); void slotAboutTranslation(); void slotConnections(); void slotPreferences(); void slotEditKeyboardMap(); void slotPanic(); void slotResetAllControllers(); void slotResetBender(); void slotHelpContents(); void slotOpenWebSite(); void slotImportSF(); void slotEditExtraControls(); void slotShowNoteNames(); void slotControlSliderMoved(const int value); void slotExtraController(const int value); void slotControlClicked(const bool value); void slotBenderSliderMoved(const int pos); void slotBenderSliderReleased(); void slotComboBankActivated(const int index = -1); void slotComboProgActivated(const int index = -1); void slotBaseOctaveValueChanged(const int octave); void slotTransposeValueChanged(const int transpose); void slotVelocityValueChanged(int value); void slotChannelValueChanged(const int channel); void slotComboControlCurrentIndexChanged(const int index); void slotShortcuts(); void slotVelocityUp(); void slotVelocityDown(); void slotBankNext(); void slotBankPrev(); void slotProgramNext(); void slotProgramPrev(); void slotControllerNext(); void slotControllerPrev(); void slotControllerUp(); void slotControllerDown(); void slotSwitchLanguage(QAction *action); //void slotEditPrograms(); //void slotDebugDestroyed(QObject *obj); protected: void closeEvent ( QCloseEvent *event ); void customEvent ( QEvent *event ); void showEvent ( QShowEvent *event ); void hideEvent( QHideEvent *event ); private: void initialization(); bool initMidi(); void readSettings(); void writeSettings(); void applyPreferences(); void applyConnections(); void applyInitialSettings(); void populateControllers(); void populateInstruments(); void populatePrograms(int bank = -1); void refreshConnections(); void initToolBars(); void clearExtraControllers(); void initExtraControllers(); void initControllers(int channel); void resetAllControllers(); void initializeAllControllers(); void allNotesOff(); void sendController(const int controller, const int value); void sendBankChange(const int bank); void sendNoteOn(const int midiNote, const int vel); void sendNoteOff(const int midiNote, const int vel); void sendProgramChange(const int program); void sendBender(const int value); void sendPolyKeyPress(const int note, const int value); void sendChanKeyPress(const int value); void sendSysex(const QByteArray& data); void sendMessageWrapper(std::vector *message) const; void updateController(int ctl, int val); void updateExtraController(int ctl, int val); void updateBankChange(int bank = -1); void updateProgramChange(int program = -1); void grabKb(); void releaseKb(); void updateStyles(); void updateNoteNames(bool drums); void setWidgetTip(QWidget* w, int val); QByteArray readSysexDataFile(const QString& fileName); void createLanguageMenu(); QString configuredLanguage(); About *dlgAbout(); Preferences *dlgPreferences(); MidiSetup *dlgMidiSetup(); KMapDialog *dlgKeyMap(); DialogExtraControls *dlgExtra(); RiffImportDlg *dlgRiffImport(); void initLanguages(); void retranslateToolbars(); RtMidiOut* m_midiout; RtMidiIn* m_midiin; int m_currentOut; int m_currentIn; bool m_inputActive; bool m_midiThru; bool m_initialized; About *m_dlgAbout; Preferences *m_dlgPreferences; MidiSetup *m_dlgMidiSetup; KMapDialog *m_dlgKeyMap; DialogExtraControls *m_dlgExtra; RiffImportDlg *m_dlgRiffImport; Ui::VPiano ui; QLabel* m_lblBank; QLabel* m_lblBaseOctave; QLabel* m_lblBender; QLabel* m_lblChannel; QLabel* m_lblControl; QLabel* m_lblProgram; QLabel* m_lblTranspose; QLabel* m_lblValue; QLabel* m_lblVelocity; QSpinBox* m_sboxChannel; QSpinBox* m_sboxOctave; QSpinBox* m_sboxTranspose; Knob* m_Velocity; QComboBox* m_comboControl; Knob* m_Control; QSlider* m_bender; QComboBox* m_comboBank; QComboBox* m_comboProg; QStyle* m_dialStyle; Instrument* m_ins; QStringList m_extraControls; QMap > m_ctlState, m_ctlSettings; QMap m_lastBank; QMap m_lastProg; QMap m_lastCtl; int m_channel; int m_velocity; int m_baseOctave; int m_transpose; QString m_language; QMap m_supportedLangs; QTranslator *m_trq, *m_trp; QAction *m_currentLang; }; #endif // VPIANO_H vmpk-0.4.0/src/preferences.ui0000644000175000001440000004411211572642326015161 0ustar pedrousers MIDI Virtual Piano Keyboard Copyright (C) 2008-2011, Pedro Lopez-Cabanillas This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; If not, see http://www.gnu.org/licenses/ PreferencesClass 0 0 400 300 Preferences :/vpiano/vmpk_32x32.png:/vpiano/vmpk_32x32.png 3 0 QFrame::NoFrame true 0 0 394 271 QLayout::SetMinimumSize 3 1 3 1 3 1 0 0 Number of octaves spinNumOctaves The number of octaves, from 1 to 10. Each octave has 12 keys: 7 white and 5 black. The MIDI standard has 128 notes, but not all instruments can play all of them. 1 9 0 0 Key pressed color 0 0 This box displays the highligh color and code used to paint the keys that are being activated. QFrame::StyledPanel QFrame::Sunken Press this button to change the highligh color used to paint the keys that are being activated. color... 0 0 Instruments file txtFileInstrument 120 0 The instruments definition file currently loaded default true Press this button to load an instruments definition file from disk. load... 0 0 Instrument cboInstrument 0 0 200 0 Change the instrument definition being currently used. Each instruments definition file may hold several instruments on it. Keyboard Map txtFileKmap Load... Raw Keyboard Map txtFileRawKmap Load... Drums Channel cboDrumsChannel None 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Network Port txtNetworkPort Change the widget (knobs, switches) style, either using the custom look or reverting to the style selected in qtconfig. Styled Widgets true Check this box to keep the keyboard window always visible, on top of other windows. Always On Top <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to use low level PC keyboard events. This system has several advantages:</p> <ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is possible to use "dead keys" (accent marks, diacritics)</li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mapping definitions are independent of the language (but hardware and OS specific)</li> <li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Faster processing</li></ul></body></html> Raw Computer Keyboard Translate MIDI velocity to key pressed color tint true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this box to grab the PC keyboard, even when the keyboard control has not the focus. <span style=" font-weight:600;">Note for Linux users:</span> this option works well in standard KDE desktops, but fails in window managers like metacity and compiz. It is also known that using this option breaks drop down menus on GTK applications.</p></body></html> Grab Computer Keyboard QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults scrollArea spinNumOctaves btnColor txtFileInstrument btnInstrument cboInstrument txtFileKmap btnKmap txtFileRawKmap btnRawKmap cboDrumsChannel txtNetworkPort chkStyledKnobs chkAlwaysOnTop chkGrabKb chkRawKeyboard chkVelocityColor buttonBox buttonBox accepted() PreferencesClass accept() 228 185 263 11 buttonBox rejected() PreferencesClass reject() 118 179 155 14 vmpk-0.4.0/qt.conf0000644000175000001440000000003111572642326013015 0ustar pedrousers[Paths] Translations = . vmpk-0.4.0/data/0000755000175000001440000000000011572642326012441 5ustar pedrousersvmpk-0.4.0/data/pc102win.xml0000644000175000001440000000300711572642326014526 0ustar pedrousers vmpk-0.4.0/data/vmpk_32x32.png0000644000175000001440000000342611572642326014772 0ustar pedrousersPNG  IHDR ꂣAbKGD pHYs B(xIDATHǽ[l3ŬmU+-RE!-*UJT)j>J>JUڇ} UDB.Dj5qA"am֗mkbהV9}sΜxkÆ -W5exV!`;tc&FwמmgkkKyV2IIEQ(zYO)[gzSCßf?G  |VKjxx(.6ęXt{xp:VtZ JĆ\d l6! v555Ŷ4OyPiAG=RL9 30gm6+"J[ƀFkײ/Q㚨}TRaKE$= u|.uRBݯc/8_|$ p  kL?ܹ?a-6ycpy`s}SZ`#F״fօB T*y /7o`mT#ՉGj1R$ 1 f,5Oӥ M @)n4t\!(I,O# b;.H"!4**Cĭ UFx<?BŨCJIP`nnu"8mBA05XX#!MsZN^9>v+OJRn[YOJ ]!į5Mjii r64F_|JY\~=ϒqs]XQQAYܼyԁ柟xX,܊r2|nr50"fgV|nnuo=KH!oR~bYB VMPK. Виртуальная MIDI Пианино Клавиатура

Виртуальная MIDI Пианино Клавиатура


Введение

Виртуальная MIDI Пианино Клавиатура - это генератор и приёмник событий MIDI. Программа не производит никакого звука сама по себе, но может быть использована для управления MIDI синтезатором (аппаратным, программным или внешним). Вы можете использовать клавиатуру компьютера, чтобы проигрывать MIDI ноты, и также мышь. Вы можете использовать Виртуальную MIDI Пианино Клавиатуру, чтобы отображать проигранные MIDI ноты из другого инструмента или проигрывателя MIDI файлов. Чтобы сделать это, соедините порт MIDI со входным портом VMPK.

VMPK была протестирована на Linux, Windows и Mac OSX, но, возможно, вы сможете собрать её и на других системах. Если вы сделаете это, скиньте автору письмо.

Virtual Keyboard (vkeybd), написанная Takashi Iway, была вдохновителем для написания этого приложения. Это замечательная программа, хорошо служившая нам в течение многих лет. Спасибо!

VMPK использует современную GUI библиотеку: Qt4, превосходную по своим возможностям и функциональности. RtMIDI предоставляет возможности ввода/вывода MIDI. Обе библиотеки свободные и платформонезависимые, доступны для Linux, Windows и Mac OSX.

Алфавитно-цифровые привязки клавиш могут быть настроены в самой программе, c использованием графического интерфейса, и настройки хранятся в файлах XML. Сделаны некоторые схемы привязок для испанских, немецких и французских клавиатур, переведённые из тех, что были предоставлены VKeybd.

VMPK может посылать программные изменения и регулировки на MIDI синтезатор. Описания для различных стандартов и устройств могут быть предоставлены, как .INS файлы, в формате, используемом QTractor и TSE3. Он был разработан Cakewalk и также используется в Sonar.

Это программное обеспечение находится на очень ранней альфа-стадии разработки. Вы можете ознакомиться с полным списком нереализованных возможностей в файле TODO. Пожалуйста, не стесняйтесь связываться с автором, чтобы задать вопросы, сообщить об ошибках или предложить новые возможности. Вы можете использовать систему слежения за ошибками на сайте проекта SourceForge.

Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

Виртуальная MIDI Пианино Клавиатура ‒ это свободное программное обеспечение, распространяющееся по лицензии GPL v3 license.

Начало работы

Принципы MIDI

MIDI ‒ это индустриальный стандарт соединения музыкальных инструментов. Он основан на пересылке действий, производимых музыкантом, играющим на музыкальном инструменте, на другой инструмент. Музыкальные инструменты, оснащённые MIDI интерфейсами, обычно имеют два DIN разъёма, обозначенные MIDI IN и MIDI OUT. Иногда встречается третий разъём, обозначенный MIDI THRU. Чтобы соединить два MIDI инструмента, нужно соединить MIDI кабелем разъём MIDI IN инструмента, посылающего события, и MIDI IN принимающего. Вы можете найти больше информации, а также обучения, как это, по всему Интернету.

Для компьютеров также существуют аппаратные MIDI интерфейсы с MIDI IN и OUT портами, к которым вы можете подключать MIDI кабели, чтобы соединить комьютер с внешними MIDI инструментами. Если аппаратный интерфейс не нужен, компьютер может использовать программное обеспечение MIDI. Пример тому VMPK, которая предоставляет MIDI IN и OUT порты. Вы можете подключать к портам VMPK виртуальные MIDI кабели, чтобы соединить программу с другими программами или с физическими портами MIDI интерфейса компьютера. Больше деталей об этом будет написано позже. Скорее всего вы захотите соединить MIDI выход VMPK со входом какого-нибудь синтезатора, который переводит MIDI в звук. Другим примером для соединения может быть MIDI монитор, который переводит события MIDI в читаемый текст. Это поможет вам понять, что за информация посылается, используя протокол MIDI. В Linux вы можете попробовать KMidimon, а в Windows MIDIOX.

VMPK не производит никакого звука. Вам потребуется программный синтезатор MIDI, чтобы услышать проигрываемые ноты. Я советую попробовать QSynth, графическую оболочку для Fluidsynth. Также можно использовать "Microsoft GS Wavetable SW Synth", который идёт с XP. Конечно, использование внешнего MIDI синтезатора будет даже лучшим подходом.

Привязки клавиш и описания инструментов

VMPK может помочь вам изменить звуки в вашем MIDI синтезаторе, но только если вы сначала предоставите описание для звуков синтезатора. Описания ‒ это текстовые файлы с расширением .INS, в том же формате, что используют Qtractor (Linux), и Sonar (Windows).

Когда вы запускаете VMPK в первый раз, вам нужно открыть диалоговое окно Параметры и выбрать файл описаний, а затем выбрать название инструмента из тех, что предоставляет файл описаний. Вы можете найти такой файл в директории с данными VMPK (обычно "/usr/share/vmpk" в Linux, и "C:\Program Files\VMPK" в Windows). Он называется "gmgsxg.ins" и содержит описания для стандартов General MIDI, Roland GS и Yamaha XG. У этого файла очень простой формат, и вы можете использовать текстовый редактор, чтобы просмотреть, изменить его и создать новый. Вы можете найти библиотеку описаний инструментов на ftp-сервере cakewalk.

Начиная с релиза 0.2.5 вы также можете импортировать файлы Sound Font (в форматах .SF2 или DLS), как описания инструментов, используя диалог, доступный через меню Файл->Импортировать SoundFont.

Другая настройка, которую вы возможно захотите совершить ‒ это привязки клавиш. Раскладка по умолчанию охватывает около двух с половиной октав для QWERTY клавиатуры, но в директории с данными находятся ещё несколько описаний привязок, адаптированных для других международных раскладок. Вы даже можете задать собственные схемы привязки, используя диалоговое окно, доступное через меню Правка->Привязки клавиш. Также есть опции для загрузки и сохранения схем привязок, как XML файлов. Последняя загруженная схема привязок будет восстановлена при следующем запуске VMPK. На самом деле, все ваши параметры, выбранный банк MIDI и программа, и значения регуляторов будут сохранены при выходе и восстановлены, когда вы в следующий раз запустите VMPK.

Соединения MIDI и виртуальные MIDI кабели

Чтобы соединить два аппаратных MIDI устройства, вам нужны физические MIDI кабели. Чтобы соединить MIDI программы, вам нужны виртуальные MIDI кабели. В Windows вы можете использовать такие MIDI кабели, как MIDI Yoke, Maple, LoopBe1 или Sony Virtual MIDI Router.

В процессе установки MIDI Yoke будут установлены драйвер и апплет панели управления, в котором можно изменять доступное количество MIDI портов (вам потребуется перезагрузить компьютер после изменения этой установки). MIDI Yoke работает, посылая каждое событие MIDI, записанное на OUT порт, на соответствующий IN порт. Например, VMPK можно соединить с выходом порта 1, а другая программа, к примеру QSynth, может считывать события с порта 1.

Используя MIDIOX, можно добавить больше маршрутов между портами MIDI Yoke и другими системными MIDI портами. Эта программа также предоставляет много интересных функций, например проигрыватель MIDI файлов. Вы можете слушать песни, проигрываемые MIDI Synth и в то же время видеть проигрываемые ноты (только один канал) в VMPK. Чтобы сделать это, вам нужно в окне "Маршруты" в MIDIOX соединить входной порт 1 с портом Window Synth. Также настройте порт MIDI проигрывателя, чтобы он посылал события на MIDI Yoke 1. И настройте входной порт VMPK, чтобы читать из MIDI Yoke 1. Проигрыватель будет посылать события на выход 1, который будет перенаправлять их на входной порт 1 и порт Synth одновременно.

В Linux виртуальные кабели предоставляются секвенсером ALSA. Порты создаются динамически, когда вы запускаете программу, так что их количество не фиксировано, как в MIDI Yoke. Утилита командной строки "aconnect" позволяет соединять и разъединять виртуальные MIDI кабели между любыми портами, будь то аппаратные интерфейсы или приложения. Есть хорошая графическая утилита, делающая то же самое ‒ QJackCtl. Главное назначение этой программы ‒ управление демоном Jack (запуск, остановка и мониторинг состояния). Jack предоставляет виртуальные аудио кабели, чтобы соединять порты аудио карт с аудио программами, подобно тому, как это происходит с виртуальными MIDI кабелями, но для цифровых аудио данных.

Часто Задаваемые Вопросы

Как отобразить 88 клавиш?

88 ‒ это произвольное число, используемое большинством современных производителей пианино, но производители органов и синтезаторов не всегда следуют этому соглашению. VMPK может быть настроена, чтобы отображать от 1 до 10 октав. При использовании 7 октав она показывает 84 клавиши, а при 8 октавах ‒ 98 клавиш. Нет способа показать ровно 7 с 1/4 октавы.

Нет звука

VMPK не производит никакого звука сама по себе. Вам необходим MIDI синтезатор. Пожалуйста, перечитайте документацию.

Некоторые клавиши молчат

Когда вы выбираете канал 10 на стандартном MIDI синтезаторе, он играет звуки перкуссии, назначенные на многие клавиши, но не на все. На мелодичных каналах (не на 10 канале) вы можете выбирать патчи с ограниченным рядом нот. Это известно в музыке, как Тесситура.

Опция "Захватывать клавиатуру" не работает

Это известная проблема для пользователей Linux. Возможность хорошо работает в окружении KDE3/4 при использовании стандартного оконного менеджера kwin; она также работает с Enlightenment и Window Maker, но не работает с оконными менеджерами Compiz и Metacity, обычными для сборок Gnome. Также известно, что использование этой опции мешает нормальному использованию контекстных меню в приложениях GTK2. Для этой проблемы нет известного решения, кроме как избегать сломанных сценариев, если вам действительно нужна эта возможность.

Названия патчей не совпадают с реальными звуками

Вам нужно предоставить .INS файл, в точности описывающий набор звуков вашего синтезатора или SoundFont. Включённый в программу файл (gmgsxg.ins) содержит только описания для стандартных GM, GS и XG инструментов. Если ваш MIDI синтезатор не совпадает ни с одним из них, вам нужно достать другой .INS файл либо создать его самостоятельно.

Какой синтаксис у файлов Описаний Инструментов (.INS)?

Одно из описаний формата INS можно найти здесь.

Могу ли я перевести мои Описания Инструментов для vkeybd в .INS файл?

Конечно. Используйте AWK скрипт "txt2ins.awk". Вы можете даже использовать утилиту sftovkb из vkeybd, чтобы создать .INS файл из любого SF2 SoundFont, но функция импорта названий инструментов из файлов SF2 и DLS есть и в VMPK.

$ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
$ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

Вы можете найти AWK скрипт "txt2ins.awk" в директории с данными VMPK.

Скачать

Вы можете найти последнюю версию исходных файлов, пакеты для Windows и Mac OSX на сайте проекта SourceForge.

Также есть готовые Linux пакеты для:

Установка из исходников

Скачайте исходники с http://sourceforge.net/projects/vmpk/files. Распакуйте исходники в вашу домашнюю директорию, и перейдите в распакованную директорию.

$ cd vmpk-x.y.z

Вы можете выбирать между сборочными системами CMake и Qmake, но qmake предусматривается только для тестирования и разработки.

$ cmake .
или
$ ccmake .
или
$ qmake

После этого скомпилируйте программу:

$ make

Если программа успешно скомпилировалась, вы можете установить её:

$ sudo make install

Требования

Чтобы успешно собрать и использовать VMPK, вам потребуется Qt 4.6, либо более новая версия. (установите -devel пакет для вашей системы или скачайте open source редакцию с qtsoftware.com, бывший Trolltech.)

RtMIDI включён в пакет исходных кодов. Он использует секвенсер ALSA в Linux, WinMM в Windows и CoreMIDI в Mac OSX, которые являются встроенными MIDI системами для каждой из поддерживаемых платформ.

Система сборки основана на CMake.

Вам также потребуется компилятор GCC C++. MinGW ‒ это его Windows порт.

Опционально, вы можете собрать установочную программу Windows, используя NSIS.

Заметки для пользователей Windows

Чтобы скомпилировать исходники в Windows, вам потребуется скачать архив в формате .bz2 или .gz и распаковать его, используя любую программу, которая поддерживает этот формат, например 7-Zip.

Чтобы сконфигурировать исходники, вам потребуется qmake (из Qt4) или CMake. Вам необходимо установить переменную среды PATH, чтобы она включала директории с исполняемыми файлами Qt4, MinGW и CMake. Программа CMakeSetup.exe ‒ это графическая версия CMake для Windows.

Заметки для пользователей Mac OSX

Вы можете найти прекомпилированный пакет приложения, включающий библиотеки Qt4, на странице скачек проекта. Если вы предпочитаете устанавливать из исходников, вы можете использовать CMake или Qmake, чтобы собрать пакет приложения, скомпонованный с установленными системными библиотеками. Вы можете использовать как Qt4 от qtsoftware.com, так и пакет, распространяемый Fink.

Система сборки сконфигурирована, чтобы производить универсальный исполняемый файл (x86+ppc) в пакете приложений. Вам потребуются инструменты разработчика Apple, а так же Qt4 SDK от Nokia.

Чтобы скомпилировать VMPK, используя файлы сборки Makefile, сгенерированные qmake:

$ qmake vmpk.pro -spec macx-g++
$ make
опционально:
$ macdeployqt build/vmpk.app

Чтобы скомпилировать, используя файлы сборки Makefile, сгенерированные CMake:

$ cmake -G "Unix Makefiles" .
$ make

Чтобы создать файлы проекта Xcode:

$ qmake vmpk.pro -spec macx-xcode
или
$ cmake -G Xcode .

Если вам нужно что-нибудь, чтобы производить шум, возможно вы захотите взглянуть на SimpleSynth, или FluidSynth (доступен с Fink). Для маршрутизации MIDI, также есть MIDI Patchbay.

Заметки для упаковщиков и продвинутых пользователей

Вы можете попросить компилятор выполнять некоторую оптимизацию во время сборки программы. Есть два пути сделать это: во первых, используя предопределённый тип сборки.

$ cmake . -DCMAKE_BUILD_TYPE=Release

Тип CMake "Release" использует флаги компилятора: "-O3 -DNDEBUG". Другие предопределённые типы сборки, это "Debug", "RelWithDebInfo", и "MinSizeRel". Второй путь, это выбрать флаги компилятора самостоятельно.

$ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
$ cmake .

Вам следует подобрать лучшие CXXFLAGS для вашей собственной системы.

Если вы хотите установить программу в иное место, чем заданное по умолчанию (/usr/local), используйте следующую опцию CMake:

$ cmake . -DCMAKE_INSTALL_PREFIX=/usr

Благодарности

В дополнение к вышеупомянутым инструментам, VMPK использует работы из следующих open source проектов.

Огромное вам спасибо!


Примечание переводчика

Этот документ был переведён на русский язык Serguey G Basalaev <s-basalaev@users.sourceforge.net>. Пожалуйста, напишите мне, если вы обнаружили в тексте ошибки или неточности перевода.

This document was translated into Russian by Serguey G Basalaev. Please mail me if you find any mistakes or translation inaccuracies in the text.

vmpk-0.4.0/data/TheresaKnott_piano.svg0000644000175000001440000017572011572642326016777 0ustar pedrousers image/svg+xml vmpk-0.4.0/data/led_green.svg0000644000175000001440000001375111572642326015115 0ustar pedrousers button-green webpage button shape Benji Park Benji Park Benji Park image/svg+xml en vmpk-0.4.0/data/german.xml0000644000175000001440000000356411572642326014444 0ustar pedrousers vmpk-0.4.0/data/list-remove.svg0000644000175000001440000003440211572642326015433 0ustar pedrousers image/svg+xml vmpk-0.4.0/data/help_fr.html0000644000175000001440000004722111572642326014754 0ustar pedrousers VMPK. Virtual MIDI Piano Keyboard

Virtual MIDI Piano Keyboard

Introduction

VMPK est un générateur et récepteur d'événements MIDI. Il ne produit aucun son par lui-même, mais peut être utilisé pour commander un synthétiseur MIDI (matériel ou logiciel, interne ou externe). Vous pouvez utiliser le clavier de l'ordinateur pour jouer des notes, mais aussi la souris. Vous pouvez utiliser le clavier virtuel pour visualiser les notes jouées par un autre instrument ou un lecteur de fichiers MIDI. Pour ce faire, connectez le port de sortie de votre instrument au port d'entrée de VMPK.

VMPK a été testé sur Linux, Windows et Mac OSX, mais doit pouvoir être compilé pour d'autres systèmes. Si vous compilez VMPK pour un autre système, faites le savoir à l'auteur.

Le Virtual Keyboard par Takashi Iway (vkeybd) a inspiré le développement de VMPK. C'est un logiciel formidable qui nous a servi pendant des années. Merci!

VMPK utilise un framework d'interface graphique moderne : Qt4, qui permet d'excellentes performances et fonctionnalités. RtMIDI fournit les fonctionnalités d'entrée/sortie MIDI. Ces deux frameworks sont libres et indépendants de la plateforme, disponible pour Linux, Windows et Mac OSX.

Les correspondances du clavier alphanumérique peuvent être configurées depuis l'interface du programme, et les paramètres sont stockés dans des fichiers XML. Quelques fichiers de correspondance pour les claviers espagnols, allemands, et français sont livrés avec VMPK, traduits depuis ceux de VKeybd.

VMPK peut envoyer des changements de programme et des controllers au synthétiseur MIDI. Les définitions pour différents standards et matériels peuvent être fournies grâce à des fichiers .INS, le même format utilisé par QTractor et TSE3. Ce format a été développé par Cakewalk et est utilisé par Sonar.

Ce logiciel est a un stade de développement alpha. Voir le fichier TODO pour une liste des fonctionnalités à venir. N'hésitez pas à contacter l'auteur pour poser des questions, rapporter des bugs ou proposer de nouvelles fonctionnalités. Vous pouvez utiliser le tracker sur le site du project SourceForge.

Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

Virtual MIDI Piano Keyboard est un logiciel libre sous licence GPL v3.

Pour commencer

Concepts MIDI

MIDI est un standard industriel pour connecter des instruments de musique. Le principe est de transmettre les actions effectuées par un musicien jouant d'un instrument à un autre instrument. Les instruments de musique MIDI ont en général deux prises DIN nommées MIDI IN et MIDI OUT. Parfois il y a une troisième prise nommée MIDI THRU. Pour connecter un instrument MIDI à un autre, on utilise un câble MIDI branché sur la prise MIDI OUT de l'instrument qui envoie, et à la prise MIDI IN de l'instrument qui reçoit. Vous pouvez trouver plus d'informations et des tutoriels comme celui ci sur le Web.

Il y a aussi des interfaces MIDI matérielles pour les ordinateurs, fournissant des ports MIDI IN et MIDI OUT, auxquels vous pouvez attacher des câbles MIDI pour communiquer avec des instruments MIDI externes. Sans utiliser d'interface matérielle, un ordinateur peut aussi utiliser des logiciels MIDI. Par exemple, VMPK fournit un port MIDI IN et un port MIDI OUT. Vous pouvez brancher des câbles MIDI virtuels aux ports de VMPK pour connecter le programme à d'autres programmes ou aux ports MIDI physiques de l'ordinateur. Plus de détails seront donnés par la suite. D'ordinaire, vous voudrez connecter la sortie MIDI de VMPK à l'entrée d'un synthétiseur qui transforme du MIDI en son. Une autre destination peut être un moniteur MIDI qui traduit les événements MIDI en texte "lisible". Ceci peut vous aider à comprendre les informations transmises par le protocole MIDI. Sous Linux, vous pouvez utiliser KMidimon et sous Windows MIDIOX.

VMPK ne produit aucun son. Vous devez utiliser un synthétiseur pour entendre les notes jouées. Je recommende d'utiliser QSynth, une interface graphique pour Fluidsynth. Il est aussi possible d'utiliser "Microsoft GS Wavetable SW Synth" fournit sous Windows. Bien sûr, un synthétiseur MIDI externe est une approche encore meilleure.

Correspondance des touches du clavier et définition des instruments

VMPK peut vous aider à changer les sons de votre synthéthiseur MIDI, mais seulement si vous fournissez une définition des sons du synthétiseur. Ces définitions sont des fichiers texte avec l'extension .INS, le format utilisé par Qtractor (Linux), et Sonar (Windows).

Quand vous lancez VMPK pour la première fois, vous pouvez ouvrir la boite de dialogue Préférences et choisir un fichier de définitions, puis choisir le nom de l'instrument parmi ceux fournis par le fichier de définitions. Un fichier de définitions est installé par défaut dans le répertoire data de VMPK ("/usr/share/vmpk" sous Linux, et "C:\Program Files\VMPK" sous Windows) nommé "gmgsxg.ins", qui contient les définitions pour les standards General MIDI, Roland GS et Yamaha XG. C'est un format très simple et vous pouvez utiliser un éditeur de texte, pour éditer ou créer un nouveau fichier. Vous pouvez trouver une liste de définitions sur le serveur FTP cakewalk.

Depuis la version 0.2.5, vous pouvez importer des fichiers Soundfont (au format .SF2 ou DLS) en tant que définition d'instruments, en utilisant le menu Fichier->Importer un SoundFont.

Vous pouvez aussi personnaliser la correspondance des touches du clavier alphanumérique. Par défaut, la correspondance couvre deux octaves et demi sur un clavier QWERTY, mais il y a des fichier de configuration adaptés à votre clavier dans le répertoire data. Vous pouvez aussi définir vos propres attributions des touches dans Edition->Attribution des touches. Vous pouvez aussi sauver et charger ces préférences dans des fichiers XML. Le dernier fichier utilisé sera chargé au prochain démarrage de VMPK. En fait, toutes vos préférences, la banque MIDI sélectionnée, le programme, les valeurs de controlleurs seront sauvés et restaurés au prochain démarrage.

Connection MIDI et câbles MIDI virtuels

Pour connecter du matériel MIDI, vous utilisez des câbles MIDI physiques. Pour connecter des logiciels MIDI vous avez besoin de câbles virtuels. Sous Windows, vous pouvez utiliser des câbles virtuels tels que MIDI Yoke, Maple, LoopBe1 ou Sony Virtual MIDI Router.

MIDI Yoke installera le pilote et une interface pour changer le nombre de ports disponibles (vous devrez redémarrer l'ordinateur après avoir changer ce paramètre). MIDI Yoke fonctionne en envoyant chaque événement envoyé sur un port OUT au port IN correspondant. Par exemple, VMPK peut connecter le port OUT au port 1, et un autre programme comme QSynth peut lire l'événement sur le port 10 .

En utilisant MIDIOX, vous pouvez ajouter des routes entre les ports MIDI Yoke et les autres ports MIDI. Ce programme fournit aussi d'autres fonctions comme un lecteur de fichier MIDI. Vous pouvez écouter des morceaux joués par un synthétiseur MIDI et voir les notes jouées en même temps dans VMPK (un canal à la fois seulement). Pour ce faire, vous pouvez utiliser la fenêtre "Routes" de MIDIOX et connecter le port 1 IN au port du synthétiseur de Windows. Configurez aussi le lecteur MIDI pour envoyer ses événements sur le port 1 de MIDI Yoke. Enfin, configurez le port d'entrée de VMPK pour lire les événements depuis le port 1 de MIDI Yoke. Le lecteur va donc envoyer les événements sur le port OUT 1, qui seront routés à la fois sur le port IN 1 et sur le synthétiseur.

Sous Linux, le séquenceur ALSA fournit les câbles virtuels. Les ports sont créés dynamiquement lorsque vous démarrez un programme, il n'y en a donc pas un nombre fixe comme avec MIDI Yoke. L'utilitaire en ligne de command "aconnect" permet de connecter et déconnecter les câbles MIDI virtuels entre n'importe quel port, matériel ou applicatif. Un autre programme pour faire de même est QJackCtl. Le but de ce programme est de controller le démon Jackd (démarrer, arrêter et surveiller l'état). Jack fournit des cables virtuels pour connecter les ports de votre carter son et les programmes audio de la même façon que des câbles virtuels MIDI mais pour l'audio.

Foire aux questions

Comment afficher 88 touches sur le piano?

88 est un nombre de touches arbitraire utilisé par la plupart des constructeurs de piano modernes, mais les constructeurs d'orgues et de synthétiseurs ne respectent pas toujours cette convention. VMPK peut être personnalisé pour afficher de 1 à 10 octaves. En utilisant 7 octaves, il affiche 84 touches, et pour 8 octaves, il affiche 98 touches. On ne peut pas afficher 7 octaves et demi et exactement 88 touches.

Il n'y a pas de son

VMPK ne produit pas de son par lui même. Vous devez utiliser un synthétiseur MIDI, et s'il vous plaît, lisez la documentation encore une fois.

Certaines touches sont silencieuses

Lorsque vous sélectionnez le canal 10 sur un synthétiseur MIDI standard, il joue des sons de percussions associés à certaines touches seulement. Sur les canaux mélodiques, (pas le canal 10) vous pouvez sélectionner des instruments avec une certaine tessiture.

L'option "Grab Keyboard" echoue

C'est un problème connu sous Linux. Cette fonctionnalité fonctionne sous KDE3/4 avec Kwin; elle fonctionne aussi avec Enlightenment et Window Maker, mais ne marche pas avec Metacity et Compiz utilisés souvent sous Gnome. Utiliser cette option ne permet pas d'utiliser le menu sous sous GTK2. Il n'y a pas de solution connue à ce problème excepté eviter les scénarios connus si vous avez vraiment besoin de cette fonctionnalité.

Les noms d'instruments ne correspondent pas aux sons rééls

Vous devez fournir un fichier .INS qui décrit exactement les instruments de votre synthétiseur ou de votre soundfont. Le fichier inclu (gmgsxg.ins) contient des définitions pour les standards GM, GS et XG seulement. Si votre synthétiseur se comporte différement vous devez utiliser un autre fichier .INS ou le créer vous même.

Syntaxe des fichiers de définitions d'instruments, fichiers (.INS) ?

Une explication du format INS est disponible à cette adresse.

Puis je convertir mes définitions d'instruments pour vkeybd en fichier .INS ?

Bien sûr. Utilisez le script AWK "txt2ins.awk". Vous pouvez même utiliser l'utilitaire sftovkb livré avec vkeybd pour créer un fichier .INS depuis une soundfont, mais il y a aussi une fonction pour importer une liste d'instruments depuis une soundfont DF2 ou DLS dans VMPK.

 
$ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
$ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

Vous pouvez trouver le script AWK "txt2ins.awk" dans le répertoire data de VMPK

Téléchargement

Les dernières sources ainsi que fichiers pour Windows et Mac OSX sont disponibles sur SourceForge.

Il y a aussi des paquets pour Linux :

Si vous distribuez un paquet VMPK pour une autre distribution, envoyez moi un email et j'ajouterai un lien vers votre site ici.

Installation depuis les sources

Télécharger les sources depuis http://sourceforge.net/projects/vmpk/files. Détarrez et changez de répertoire.

 
$ cd vmpk-x.y.z

Vous pouvez choisir CMake ou Qmake pour préparer votre système de build, mais qmake est destiné seulement au développement et au test.

 
$ cmake .
or
$ ccmake .
or
$ qmake

Ensuite, compilez le programme :

 
$ make

Si le programme compile correctement, vous pouvez l'installer :

 
$ sudo make install

Configuration requise

Pour compiler et utiliser VMPK, vous devez avoir Qt 4.6 ou plus récent. (installer le paquet -devel pour votre système, ou téléchargez l'édition Open Source depuis qt.nokia.com, anciennement Trolltech.)

RtMIDI est inclus dans les sources. Il utilise ALSA sous Linux, WinMM sous Windows et CoreMIDI sous Mac OSX, qui sont les systèmes MIDI natifs de chaque plateforme.

Le système de build est basé sur CMake.

Vous devez aussi avoir le compilateur GCC C++. MinGW est un portage pour Windows.

De manière optionnelle, vous pouvez créer un programme d'installation pour Windows en utilisant NSIS.

Notes aux utilisateurs de Windows

pour compiler les sources sous Windows, vous devez télécharger le .bz2 ou le .gz et le décompresser avec un utilitaire tel que 7-Zip.

Pour configurer les sources, utilisez qmake (de Qt4) ou CMake. La variable d'environnement PATH doit contenir les répertoires des binaires de Qt4, des binaires de MinGW et aussi des binaires de CMake. Le programme CMakeSetup.exe est la version graphique de CMake pour Windows.

Notes aux utilisateurs de Mac OSX

Vous pouvez télécharger un bundle précompilé, incluant Qt4, sur la page de téléchargement. Si vous préférez installer depuis les sources, CMake ou Qmake peuvent être utilisé pour compiler l'application liés aux librairies du système. Vous pouvez utiliser Qt4 de qtsoftware.com ou un paquet distribué par Fink.

Le système de build est configuré pour créer un Universal Binary (x86+ppc) dans un bundle d'application. Vous devez avoir les outils de développement Apple ainsi que le Qt4 SDK de Nokia.

Pour compiler VMPK en utilisant les Makefiles, générés par qmake :

 
$ qmake vmpk.pro -spec macx-g++
$ make
optionnellement:
$ macdeployqt build/vmpk.app

Pour compiler VMPK en utilisant les Makefiles, générés par CMake :

 
$ cmake -G "Unix Makefiles" .
$ make

Pour créer le projet Xcode :

 
$ qmake vmpk.pro -spec macx-xcode
ou
$ cmake -G Xcode .

Si vous avez besoin de quelque chose pour produire du son, jettez un oeil sur SimpleSynth, FluidSynth (dans Fink). Et pour du routing MIDI, il y a aussi MIDI Patchbay.

Notes aux utilisateurs avancés

Vous pouvez demander quelques optimisations au compilateur. Il y a deux façons. D'abord, utiliser un type de build prédéfini.

 
$ cmake . -DCMAKE_BUILD_TYPE=Release

Le type CMake "Release" utilise les flags : "-O3 -DNDEBUG". Les autres types prédéfinis sont "Debug", "RelWithDebInfo", et "MinSizeRel". L'autre manière est de choisir vos flags vous même.

 
$ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
$ cmake .

Vous devez choisir les meilleurs CXXFLAGS pour votre système.

Si vous souhaitez installer le programme à un autre endroit que le répertoire par défaut (/usr/local), utilisez l'option :

 
$ cmake . -DCMAKE_INSTALL_PREFIX=/usr

Remerciements

En plus des outils déjà cités, VMPK utilise le travail des projets libres suivants.

  • de Qtractor, par Rui Nuno Capela
    Instrument definition data classes
  • de QSynth, par Rui Nuno Capela
    Knob widget
  • Icône et logo par Theresa Knott
  • Merci beaucoup !

    vmpk-0.4.0/data/vmpk.qrc0000644000175000001440000000042411572642326014125 0ustar pedrousers vmpk_32x32.png vmpk_128x128.png blkey.svg list-remove.svg list-add.svg led_green.svg led_grey.svg vmpk-0.4.0/data/led_grey.svg0000644000175000001440000001361611572642326014763 0ustar pedrousers button-yellow webpage button shape Benji Park Benji Park Benji Park image/svg+xml en vmpk-0.4.0/data/help_es.html0000644000175000001440000004730711572642326014761 0ustar pedrousers VMPK. Teclado de piano MIDI virtual

    Teclado de piano MIDI virtual


    Introducción

    El teclado de piano MIDI virtual (VMPK) es un generador y receptor de eventos MIDI. No produce ningún sonido por si mismo, pero puede ser usado para dirigir un sintetizador MIDI (ya sea hardware o software, interno o externo). Puedes usar el teclado del ordenador para tocar notas MIDI, y también el ratón. Puedes usar el teclado de piano MIDI virtual para mostrar las notas tocadas desde otro instrumento o reproductor de archivos MIDI. Para ello, conecta el otro puerto MIDI al puerto de entrada de VMPK.

    VMPK ha sido probado en Linux, Windows y Mac OSX, pero quizá puedas construirlo en otros sistemas. En tal caso, por favor envía un mensaje de correo electrónico al autor.

    El teclado virtual de Takashi Iway (vkeybd) ha sido la inspiración de este programa. Es una pieza de software maravillosa que nos ha servido bien durante muchos años. ¡Gracias!

    VMPK utiliza un moderno sistema gráfico: Qt4, que proporciona excelentes características y desempeño. RtMIDI proporciona las características de entrada y salida MIDI. Ambos sistemas son libres e independientes de la plataforma, disponibles para Linux, Windows y Mac OSX.

    El mapa del teclado alfanumérico se puede configurar desde dentro del programa usando el interfaz gráfico de usuario, y los ajustes se almacenan en archivos XML. Se incluyen algunos mapas para las disposiciones de teclados español, alemán y francés, traducidos desde los archivos correspondientes proporcionados por vkeybd.

    VMPK puede transmitir cambios de programa y controladores hacia un sintetizador MIDI. Las definiciones para diferentes estándares y dispositivos pueden ser proporcionadas como archivos .INS, el mismo formato utilizado por QTractor y TSE3. Fue desarrollado por Cakewalk y también se usa en Sonar.

    Este software está en una fase alfa temprana. El archivo TODO contiene una lista de características pendientes. Por favor, no dudes en contactar con el autor para hacer preguntas, informar de fallos, y proponer nuevas funcionalidades. Puedes usar el sistema de seguimiento en el sitio del proyecto de SourceForge.

    Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

    Virtual MIDI Piano Keyboard es software libre bajo los términos de la licencia GPL v3.

    Primeros pasos

    Conceptos MIDI

    MIDI es un estándar industrial para conectar instrumentos musicales. Se basa en la transmisión de las acciones llevadas a cabo por un músico tocando un instrumento hacia otro instrumento diferente. Los instrumentos musicales habilitados con interfaces MIDI suelen tener dos tomas DIN etiquetadas MIDI IN y MIDI OUT. A veces hay un tercer conector etiquetado MIDI THRU. Para conectar un instrumento MIDI a otro, se necesita un cable MIDI conectado a la toma MIDI OUT del instrumento emisor, y al MIDI IN del receptor. Puede encontrar más información y tutoriales como este por toda la red.

    También hay interfaces MIDI hardware para ordenadores, proporcionando puertos MIDI IN y MIDI OUT, en los cuales se pueden conectar cables MIDI para comunicar el ordenador con instrumentos MIDI externos. Sin necesidad de interfaces hardware, el ordenador puede usar también software MIDI. Un ejemplo es VMPK, que proporciona puertos MIDI IN y OUT. Puedes conectar cables MIDI virtuales a los puertos de VMPK, para conectar el programa a otros programas o a los puertos MIDI físicos del ordenador. Más detalles de esto más tarde. Normalmente necesitas conectar la salida MIDI de VMPK a la entrada de algún sintetizador, el cual transforma MIDI en sonido. Otro destino habitual de la conexión sería un monitor MIDI que traduce los eventos MIDI en texto legible. Esto es una ayuda para entender la clase de información que se transmite usando el protocolo MIDI. En Linux puedes probar KMidimon y en Windows MIDIOX.

    VMPK no produce ningún sonido. Se necesita un sintetizador MIDI para oír las notas ejecutadas. Te recomiendo probar QSynth, un interfaz gráfico para Fluidsynth. También es posible usar el "Microsoft GS Wavetable SW Synth" que viene con XP. Por supuesto, un sintetizador externo MIDI sería una aun mejor solución.

    Mapas de teclado y definiciones de instrumentos

    VMPK puede ayudarte a cambiar los sonidos en tu sintetizador MIDI, pero solo si antes le proporcionas una definición de los sonidos del sintetizador. Las definiciones son archivos de texto con la extensión .INS, y el mismo formato utilizado por Qtractor (Linux), y Sonar (Windows).

    Cuando inicies VMPK por primera vez, deberías abrir el diálogo Preferencias eligiendo un fichero de definición, y luego seleccionar el nombre del instrumento entre los proporcionados por el archivo de definiciones. Debería haber un archivo de definiciones de instrumentos instalado en el directorio de datos de VMPK (típicamente "/usr/share/vmpk" en Linux, y "C:\Program Files\VMPK" en Windows) llamado "gmgsxg.ins", que contiene definiciones para los estándares General MIDI, Roland GS y Yamaha XG. Es un formato muy simple, y puedes usar cualquier editor de textos para ver, cambiar y crear uno nuevo. Puedes encontrar una biblioteca de definiciones de instrumentos en el servidor FTP de Cakewalk.

    Desde la release 0.2.5 también puedes importar archivos Sound Font (en formatos .SF2 y .DLS) como definiciones de instrumentos, utilizando un diálogo disponible en el menú Archivo->Importar SoundFont.

    Otra personalización que puedes querer realizar es el mapa de teclado. La distribución por defecto mapea unas dos octavas y media del teclado alfanumérico QWERTY, pero hay algunas definiciones más en el directorio de datos, adaptadas a otras distribuciones internacionales. Puedes incluso definir tu propia distribución usando el cuadro de diálogo disponible en el menú Edición->Mapa de teclado. Hay también opciones para cargar y guardar los mapas como archivos XML. El siguiente inicio de VMPK utilizará el último mapa cargado. De hecho, todas las preferencias, los bancos y programas MIDI seleccionados, así como los valores de los controladores serán guardados al finalizar el programa, y recuperados de nuevo al iniciar VMPK en la siguiente ocasión.

    Conexiones MIDI y cables MIDI virtuales

    Para conectar dispositivos MIDI hardware necesitas cables MIDI físicos. Para conectar software MIDI necesitas cables virtuales. En windows, puedes usar software que proporciona cables MIDI virtuales, como MIDI Yoke, Maple, LoopBe1 o Sony Virtual MIDI Router.

    El proceso de instalación de MIDI Yoke instalará el controlador y un applet en el panel de control para cambiar el número de puertos MIDI que estarán disponibles (es necesario reiniciar el equipo después de cambiar esta configuración). MIDI Yoke funciona enviando cada evento escrito en un puerto de salida al correspondiente puerto de entrada. Por ejemplo, puede conectar la salida de VMPK al puerto 1, y otro programa como QSynth puede leer los mismos eventos desde el puerto 1.

    Utilizando MIDIOX puedes agregar más rutas entre los puertos de MIDI Yoke y otros puertos MIDI del sistema. Este programa también ofrece otras interesantes funcionalidades, como un reproductor de archivos MIDI. Puedes escuchar canciones que se interpretan en un sintetizador MIDI y al mismo tiempo ver las notas ejecutadas (sólo un canal a la vez) en VMPK. Para ello, puedes utilizar la ventana de "Rutas" en MIDIOX para conectar el puerto de entrada 1 al puerto del sintetizador de Windows. Además, configurar el puerto MIDI del reproductor para enviar a MIDI Yoke 1. Y configurar en VMPK el puerto de entrada para leer desde MIDI Yoke 1. El reproductor enviará los eventos al puerto 1, que serán encaminados al puerto de entrada 1 y, al mismo tiempo, al puerto del sintetizador.

    En Linux, tienes el secuenciador de ALSA que proporciona los cables virtuales. Los puertos se crean dinámicamente cuando inicias un programa, de forma que no existe un número fijo de ellos como en MIDI Yoke. El programa de línea de mandatos "aconnect" permite conectar y desconectar los cables virtuales entre puertos, ya sean interfaces hardware o aplicaciones. Una utilidad gráfica agradable para hacer lo mismo es QJackCtl. El propósito principal de este programa es controlar el demonio Jack (iniciar, parar y monitorizar su estado). Jack proporciona cables de audio virtuales para conectar los puertos de la tarjeta de sonido y los programas, de una forma similar a los cables MIDI virtuales, pero para datos de audio digital.

    Preguntas frecuentes

    ¿Como mostrar 88 teclas?

    88 es un número arbitrario de teclas usado por la mayor parte de los fabricantes de pianos, pero los fabricantes de órganos y sintetizadores no siempre siguen esta convención. VMPK puede ser personalizado para mostrar entre 1 y 10 octavas. Usando 7 octavas muestra 84 teclas, y para 8 octavas muestra 98 teclas. No hay forma de mostrar exactamente 7 octavas y media.

    No hay sonido

    VMPK no produce ningún sonido por si mismo. Necesitas un sintetizador MIDI, y por favor, vuelve a leer la documentación.

    Algunas teclas no suenan

    Cuando seleccionas el canal 10 en un sintetizador MIDI estándar, ejecuta sonidos de percusión asignados a muchas teclas, pero no a todas. En los canales melódicos (los que no son el 10) puedes seleccionar sonidos con un rango limitado de notas. Esto se conoce en música como Tesitura.

    La opción "Capturar teclado" falla

    Es un problema conocido entre los usuarios de Linux. Esta característica funciona correctamente en escritorios KDE3/4 usando el gestor de ventanas kwin estándar; también funciona con Enlightenment y Window Maker, pero falla con los gestores de ventanas Metacity y Compiz, comunes entre las instalaciones de Gnome. También se sabe que esta opción interfiere con el uso normal de los menús desplegables de las aplicaciones GTK2. No hay una solución conocida para este problema, excepto evitar los escenarios problemáticos si realmente necesitas esta característica.

    Los nombres de instrumentos no corresponden con los sonidos producidos

    Se necesita proporcionar un archivo .INS que describa exactamente el conjunto de sonidos del sintetizador, o del soundfont. El archivo incluido (gmgsxg.ins) contiene sólo las definiciones de instrumentos estándar GM, GS y XG. Si tu sintetizador MIDI no coincide exactamente con ninguno de ellos, es necesario obtener otro archivo .INS, o crearlo tu mismo.

    ¿Cual es la sintaxis de los archivos de definición de instrumentos (.INS)?

    Una explicación del formato .INS está aquí.

    ¿Cómo puedo convertir una definición de instrumentos de vkeybd en un archivo .INS?

    Usa el guión de AWK "txt2ins.awk". Puedes usar la utilidad sftovkb de vkeybd para crear un archivo .INS a partir de cualquier soundfont SF2, pero hay una función para importar los nombres de los instrumentos de archivos SF2 y DLS directamente desde VMPK.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins
    

    Puedes encontrar el guión de AWK "txt2ins.awk" en el directorio de datos de VMPK.

    Descargar

    Puedes encontrar los últimos fuentes, y paquetes para Windows y Mac OSX en el sitio del proyecto en SourceForge.

    También hay paquetes Linux listos para instalar en:

    Instalación desde fuentes

    Descarga los fuentes desde http://sourceforge.net/projects/vmpk/files. Descomprime los fuentes en el directorio personal, y cambia al directorio descomprimido.

    $ cd vmpk-x.y.z
    

    Puedes elegir entre CMake y Qmake para preparar el sistema de compilación, pero qmake está indicado sólamente para pruebas y desarrollo.

    $ cmake .
    o bién
    $ ccmake .
    o bién
    $ qmake
    

    Después, compila el programa:

    $ make
    
    #MIDI_concepts

    Si el programa ha sido compilado satisfactoriamente, puedes instalarlo:

    $ sudo make install
    

    Requisitos

    Para compilar y usar satisfactoriamente VMPK se necesita Qt 4.6 o posterior. (instala el paquete -devel de tu sistema, o bien descarga la edición open source desde qtsoftware.com, anteriormente Trolltech.)

    RtMIDI está incluido en el paquete de fuentes. Utiliza el secuenciador ALSA en Linux, WinMM en Windows y CoreMIDI en Mac OSX, que son los sistemas MIDI nativos en cada una de las plataformas soportadas.

    El sistema de construcción se basa en CMake.

    Se necesita también el compilador GCC C++. MinGW es una adaptación para Windows.

    Opcionalmente, puedes crear un programa de instalación para Windows usando NSIS.

    Notas para usuarios de Windows

    Para compilar los fuentes en Windows, necesitas descargar el archivo .bz2 o bien el .gz y descomprimirlo usando una utilidad que soporte el formato, como por ejemplo 7-Zip.

    Para configurar los fuentes, se necesita qmake (de Qt4) o CMake. Necesitas establecer el PATH incluyendo los directorios de los binarios de Qt4, los binarios de MinGW, y también los binarios de CMake. El programa CMakeSetup.exe es la versión gráfica de CMake para Windows.

    Notas para usuarios de Mac OSX

    Puedes encontrar un paquete precompilado universal, incluyendo las bibliotecas Qt4 de tiempo de ejecución en el área de descargas del proyecto. Si prefieres la instalación desde fuentes, puedes usar CMake o Qmake para construir la aplicación enlazada a las bibliotecas del sistema instaladas. Puedes usar Qt4 obtenido desde qtsoftware.com o bien el paquete distribuido por Fink.

    El sistema de construcción está preparado para producir un binario universal (x86+ppc) en un paquete de aplicación. Necesitas las herramientas de desarrollo de Apple, así como el kit de desarrollo Qt4 SDK de Nokia.

    Para compilar VMPK utilizando Makefiles, generados por qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    opcionalmente:
    $ macdeployqt build/vmpk.app
    

    para compilar utilizando Makefiles, generados por CMake:

    $ cmake -G "Unix Makefiles" .
    $ make
    

    Para crear archivos de proyecto de Xcode:

    $ qmake vmpk.pro -spec macx-xcode
    o bién
    $ cmake -G Xcode .
    

    Si necesitas algo que produzca sonido, puede que quieras echar un vistazo a SimpleSynth, o a FluidSynth (disponible desde Fink). para encaminamiento MIDI está MIDI Patchbay.

    Notas para empaquetadores y usuarios avanzados

    Puedes pedir al compilador que realice una optimización al construir el programa. Hay dos formas: usando un tipo de compilación predefinida.

    $ cmake . -DCMAKE_BUILD_TYPE=Release
    

    El tipo "Release" de CMake utiliza las opciones del compilador: "-O3 -DNDEBUG". Otros tipos de compilación predefinidos son "Debug", "RelWithDebInfo", y "MinSizeRel". La segunda forma es elegir las opciones del compilador manualmente.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .
    

    Has de determinar las mejores opciones de CXXFLAGS para tu sistema.

    Si necesitas instalar el programa en algún otro lugar distinto al predeterminado (/usr/local) utiliza la siguiente opción de CMake:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr
    

    Agradecimientos

    Adicionalmente a las herramientas anteriormente mencionadas, VMPK utiliza partes de los siguientes proyectos de código abierto.

    • de Qtractor, por Rui Nuno Capela
      Clases de definición de instrumentos
    • de QSynth, por Rui Nuno Capela
      Botones rotatorios
    • Icono y logo por Theresa Knott

    ¡Muchas gracias!

    vmpk-0.4.0/data/vmpk.icns0000644000175000001440000011751011572642326014301 0ustar pedrousersicnsHis32 /40 CM)!XK>5!/kWLC>4'uaYJ6,zh>@2/%[Fk^{b,'1+=TREa%v{\Tgl_`4qp!Zc<8.'؉r`RTMCB>833!'؈~bYYRMGC=942'؇)ca_WRMGA=853 '؆(jjd\WRMH0A>4'؆$Xm_ef]UMD,%'؈ Jr\,0(!" '؂F\>Ucn]j}uW,3؅ @4JKPWe_0 Ax-?JS\ho'yO 0:<1 :F.  '؂EI19AJ;P[_YOJ9,؅ @ "&,54%R\a\bygq Aq ")09>LaQ5  0:<1 <3(.;LV)69^ /EZcaP.   F}! 6_37:Vrt Uv PpMB[|S{ 4؀ 6opcxUl'-]ʸS6XI'M +Z{sLC'P  Q2'@+ '؀33-FG'؀%('7a'؀ !!(P '؂!G'؈<'؈ 3'؈+'، '؊(!'؏ A68>92'؎108( '،=5'؋M1'؊ b- '؉ r) '؈ z!  '؇0~ '؆+s  '؆ '3  '؈ Pl~6(؂EB6!'؅ @ #"!!%^ Ap! " 0:<1 <3 &] /EZcaP. ! G} 6_4*:Vrt Uv PpMB[{S{ 4؀ 6opcxUl'-]ʸS6XI'M +Z{sLC'P  Q2'@+ '؀33-FG'؀%('7a'؀ !!(P '؂!G'؈<'؈ 3'؈+'، '؊(!'l8mkiP/gm",8>O+aԃ u< %6DNөjF:jwN2J !~o˭V m4 }QLvvL49_>~O*oHTxHP! 0I@[2 y:it32M #  Kitx]NSk|xvxuzhdee>  õg\amxnL@4%@I($ NB Tj_ZQNGDDGB>60+*)* #`_4;998;<;98867678730) h[=<:7798/% kX8JEECB@@>=<;:=5& hU 8NEFECB@@>=3 hN;NGFFEDB@@?>73uG@PHHGFEDB@@>B ?> DPJLHGFEDB@@?>6 D2JQKKAIGFEDB@@?==?5($J'QQLML*FGFEDB@@?>;:;;72($R$TRONMM=1JFEDB@@?><;9877851%!b.YQQONMMD(LEEDB@@?><;:9766435+ ()u8\RQQONMLF.FFEDB@@?><;:976643023*$, 5ƄB]SSQQONMKJ8;IDDB@@?><;:97664310/01.- @vI]UTTQQONMKM=2JDDB@@?><;:97765311//-,/.HdO]WVTTQQONMKLB6FEDCA@?><;:97765311//.+.1POS^XXVUSRQONMKKE:DFDCA@?><;:97765311//.+/4X>[_YYXVUSRQONMKJJ;;FDCA@?><;:97765311//.+/ 3e2a`\[YXVUSRQONMKJJB=EDCA@?><;:97765311//.,, 2w'#f`]\[YXVUSRQONMKJK=CGCCA@?><;:97765311//.-&4# .j`^^\[YXVUSRQONMKJJDF@CCA@?><;:97765311//-."4*:la__^\[YXVUSRQONMKJIHDDECA@?><;:97765311//-/7&Glcb`_^\[YXVUSRQONMKJHI:SCC@@?><;:97765311//-/8*{Qmdcb`_^\[YXVUSRQONMKJIH@W@C@@?><;:97765311//.,8 6f]meedb`_^\[YXVUSRQONMKJIGGFKBA@?><;;877653210/0&:HWfnegedb`_^\[YXVUSRQONMKJIGE=X>A@?><;;877653210/09ZHnnhhgedb`_^\[YXVUTSQONMLJIGF=C8C??><;;8776532100, 8s:(tmjjhgedba_^][ZXVUTSQONMLJIHGA#0>@?><;;87765321019/;ymklihgedba_^][ZXVUTSQONMLJIHGA,%2C>><;;877653112: K{pnlkihgedba_^][ZXVUTSQONMLJIHGD./D>><;;8776344.9 Y{qonlkihgedba_^][ZXVUTSQONMLJIHFH2 *@?=<;;876583$ 9 zze{qrpnlkihgedba_^][ZXVUTSQONMLJIHFH6 ;@=<;;88:6#7++Yyssrpnlkihgedba_^][ZXVUTSQONMLJIHFG9!8@>==<;4 2 6CNgsrpmllihgedba_^][ZXVUTSQONMLJHGECE1A=93$!$0>KYjsutmihggedba_^][ZXVUTSQNMLJKJM!5% "0FJLOSUYZVG2r\SX^cb`[VPF:%D+9GUcq~ݙGFILQV[bipv{~\{p]F&K+9FTbq~cVabcfghiijllmoqsuwy{|~KovvO!  N *8ETbp}ǑJ]^acbbfhikmpqsvxy{}c5/L­^==2N )7ER`o}=HC8<>KWZ]_ceilnrtwy}rXKqpΦtMJE (6CR`n{0%212:?@ABCEFIMPTX[_cfjnqwp>NMxp[COܧ '5CQ_l{ @BA?>==>=>)?BEGJO5,Ngglpsvz~qI3h˹q! '5BP^mzWAA>>==>4?@@ABBCCEEFGIJKLO ,Cgjptywlz=M %3AP^jy?G@ABEHLPRVZ]adhkpsw{E2K9`cidM= ̼ A%3@N\kx4*B@CCDDFGHKPTX]aeimquz~V"$\ &ʽ#"#!$2@N\jw)3;+26=>/?@DGILOSVZ^hT "f@'˽ "#'*,0'>#1>LZhw9=.)9<;<<==>?@@BBDFFHJKPVVTR5#$A~QCB*˽"#&*,/4:9/#<$4@O_ju_MLG5-#2PSTUY[]`dfgjlpsx|~tD\_)-2 pm,+˽"$'*-0359>DA:/;-27Yx*%L: #AJVdjnrx}m9* %`aXEAa,-˽#$'*.136:;>BHLJH:! 8,^q<>?;$ -69@GLQUX_fp{228e%C^-0˽%%(+.136:=?BFHLQSWVA(4  >B=>A>1!.?Rfjjpw|Bj-ci`5lҋa-0˽&*+.148:=ACFILOQUY^e_K62!9CEEDCCFGCBCCHIIHA:404QnnljW<4(z[ P2aЋa-0˽ .1259<>ADFJLOSVX[]bjpgXE& &>NPRUUSQMKHFCA6 cЋa-0˽ -588:>BDGJMPTVY\`bcfksvqkP*    dЋa-0˽(0AEHKNQTWY\`behlmqvz}{X3Er) jϋa-0˽;  &0521CFFHLOQTWZ]_dfilpruw{~eF$]ˈ  jϋa-0˽>,Q͠zg^Ybhvd-CKOPQTW\^adgjlpruy{~vX+ZŊ  jϋa-0˼B K$t7Yx^[YeeW3 (?LWZYZ_adhjmpsvy|Ɵ! jϋa-/ή@  ?+A-Nͽnkwc&*/D[d``dgjnqtwy}Z pϋa-*Ҍ@!CTz/"[ߙzlcly% 6Xjihknqtwz}²~ !s΋a-/7@  ()Nac#1~VKUkaCG3))Plorssvz~ͺv #q΋a-$L?& A7JMķS  {EDƻBN[ &onO\A 2::<<:?R:DO=GBA[$@٤]06Vf; &\QQW>&%7DGDCIMHTM6$=vJ&  &VONS=1EKHIJKL`XA~S &/PMLQ;"}d2'CMNNOMPb^Nmm, $ ;NJIN:ih =MSUSQT`XVEZD !|/KHGK9 83GW[WVY__!TC !H+GGFJ9uw $?X^[\bKQA #|EDCG6 _r3Taa+M? O S@AD5 `yn&P< >>A3fri?A6?@3fle\*/<=1ahb");:/]d^@?9) :7-V_Y#989;675, O\T87897L33+ JYP65453Qt?/0(CUL430 Dd  +/'?PG21/ ?~" (-&?LC0/ (~~ %+$;F>/.- q{"("1B9-,+  e}v! & '?6 +*+ _|s} $:1 )()Xzpy!4- '&'Rwlv/*%$%Ksis )& #"#Fneo&" ! !Aiak"  =f^j 9b[g 1^Yd.YU_)UR\'QNX$NKT $JGP %HDL ,H@H 2G*=3:"8063.3.*/*'+'#'$# 6( A P  [ C  $  Jht~~w\MSk{wvxtzidee>  ƹi^cpzpNB6'BK($ NBPTG>40'$%($ ``      h\ kZ   hViP 3uH  ?? D3  J'   R !b  )u     5ł    @t  Hb  PN $  X=     e1  )  w' 5   $ 7  * !+/  & ! G  *z  P   6f  84   HW!(J   ZI# B   s=# #  -& %!    '     &!    z|%"!    ++ ,'!"    5@IA%!  ! $0>M]S$$ :"0BFGIIJLNOPRSY7 ^^bcdegdba_\XTTNG<-K+9FTbq~O(3345789:;;==?@BCEFGHJLMS-r`OXYZ\]`befhkmorrpmkj`K2 N *8ETbp}Ȑ*/1354679:<=>@BDDFHHJKMNOT;$1D`Y[[]^`abdfjpomklpsvxyz}oX=''" N )7ER`o}8 %,.02479<>ABEGIKLNQSXE6K^\degiknpsq]HG\pusqqsuwx{lK32E (6CR`n{' !%'*-/247;>@DA&ODDYX[]`cehi^RG9*2Qosstuvxzk '5CQ_l{} ) "& 5,&88 !#'),.0369C?2'"̼ A%3@N\kx4  !#'*-1479<@CFILORU[5%kmpsurmeabfgila;%ʽ#"#!$2@N\jw$"$&*,/17. >MOSW[__ad[Q)  '˽ "#'*,0'#1>LZhw|  "#&++,.&%-LJORSRRK/9B!*˽"#&*,/4:9/#<#4@O_ju\&$ ')*,-.03688;<@BEGIKLD)6;(WWY[_c_ pm,+˽"$'*-0359>DA:/;-27Yx( # %,5:=@DHLPSVWZ]adgkmpqc@!!$:ZUR;5+BHLJH:! 8,^q;"%*-049?GLNPUY^bgkkiU0; P[\S=2^-0˽%%(+.136:=?BFHLQSWVA(   "  +69;?EIOVX['i. >=;$ hӊa-0˽&*+.148:=ACFILOQUY^e_K6"#$%",=<1"zZ R)aЋa-0˽ .1259<>ADFJLOSVX[]bjpgXE&%'(*+*)(('&%#    cЋa-0˽ -588:>BDGJMPTVY\`bcfksvqkP*    dЋa-0˽(0AEHKNQTWY\`behlmqvz}{X3Dr* jϋa-0˽;  &0521CFFHLOQTWZ]_dfilpruw{~eF$]ˈ  jϋa-0˽>,Q͠zg^Ybhvd-CKOPQTW\^adgjlpruy{~vX+ZŊ  jϋa-0˼B K$t7Yx^[YeeW3 (?LWZYZ_adhjmpsvy|Ɵ! jϋa-/ή@  ?+A-Nͽnkwc&*/D[d``dgjnqtwy}Z pϋa-*Ҍ@!CTz/"[ߙzlcly% 6Xjihknqtwz}²~ !s΋a-/7@  ()Nac#1~VKUkaCG3))Plorssvz~ͺv #q΋a-$L?& A7JMķS  {EDƻBN[ &onO\A 2::<<:?R:DO=GBA[$@٤]06Vf; &\QQW>&%7DGDCIMHTM6$=vJ&  &VONS=1EKHIJKL`XA~S &/PMLQ;"}d2'CMNNOMPb^Nmm, $ ;NJIN:ih =MSUSQT`XVEZD !|/KHGK9 83GW[WVY__!TC !H+GGFJ9uw $?X^[\bKQA #|EDCG6 _r3Taa+M? O S@AD5 `yn&P< >>A3fri?A6?@3fle\*/<=1ahb");:/]d^@?9) :7-V_Y#989;675, O\T87897L33+ JYP65453Qt?/0(CUL430 Dd  +/'?PG21/ ?~" (-&?LC0/ (~~ %+$;F>/.- q{"("1B9-,+  e}v! & '?6 +*+ _|s} $:1 )()Xzpy!4- '&'Rwlv/*%$%Ksis )& #"#Fneo&" ! !Aiak"  =f^j 9b[g 1^Yd.YU_)UR\'QNX$NKT $JGP %HDL ,H@H 2G*=3:"8063.3.*/*'+'#'$# 6( A P  [ C  $  Jht~~w\MSk{xvxtzidee>  ǹj_dp{qOB6'BK'$ NBNO@7-'  `` h\kZ hViP 3vI ?@D3 J'  S   !b  )u  5Ł   @t   Ha   OM  X<  e0 #w( 1$ 2 * $) &  D*z N  6f 5. HW  #F ZI A s@ $/ #         z{  ! ++ "    4?H8  " $0?N^M  ;"0LZhw{ '' ! !! /D#*˽"#&*,/4:9/##4@O_ju]   !! '! "$$# pm,+˽"$'*-0359>DA:/-27Yx( !  !!"!"$#$ "$#!7a,-˽#$'*.136:;>BHLJH:! ,^q; !"!"#"$" /=!#$ ^-0˽%%(+.136:=?BFHLQSWVA(4      "#"$h/dӊa-0˽&*+.148:=ACFILOQUY^e_K6&  yY R!bЋa-0˽ .1259<>ADFJLOSVX[]bjpgXE&   cЋa-0˽ -588:>BDGJMPTVY\`bcfksvqkP*   dЋa-0˽(0AEHKNQTWY\`behlmqvz}{X3Dr* jϋa-0˽;  &0521CFFHLOQTWZ]_dfilpruw{~eF$]ˈ  jϋa-0˽>,Q͠zh^Zaivd-CKOPQTW\^adgjlpruy{~vX+ZŊ  jϋa-0˼B K$t7Yx_\ZfeW3 (?LWZYZ_adhjmpsvy|Ɵ! jϋa-/ή@  ?+A-Nͽnkxc&+/D[d``dgjnqtwy}Z pϋa-*Ҍ@!CTz/"[ޚzmdmx% 6Xjihknqtwz}²~ !s΋a-/7@  ()Nac#1~WKUlaDH3))Plorssvz~ͺv #q΋a-$L?& A7JMķS  {EDƻBN[ &onO\A 2::<<:?R:DO=GBA[$@٤]06Vf; &\QQW>&%7DGDCIMHTM6$=vJ&  &VONS=1EKHIJKL`XA~S &/PMLQ;"}d2'CMNNOMPb^Nmm, $ ;NJIN:ih =MSUSQT`XVEZD !|/KHGK9 83GW[WVY__!TC !H+GGFJ9uw $?X^[\bKQA #|EDCG6 _r3Taa+M? O S@AD5 `yn&P< >>A3fri?A6?@3fle\*/<=1ahb");:/]d^@?9) :7-V_Y#989;675, O\T87897L33+ JYP65453Qt?/0(CUL430 Dd  +/'?PG21/ ?~" (-&?LC0/ (~~ %+$;F>/.- q{"("1B9-,+  e}v! & '?6 +*+ _|s} $:1 )()Xzpy!4- '&'Rwlv/*%$%Ksis )& #"#Fneo&" ! !Aiak"  =f^j 9b[g 1^Yd.YU_)UR\'QNX$NKT $JGP %HDL ,H@H 2G*=3:"8063.3.*/*'+'#'$# 6( A P  [ C t8mk@+FJVWht|#m,6 F TcDwe5#̵4 (`61wWCɧm X nB46G!9XUo ~6p /;ejᢥF#:dm(iZF̎)I 'l@ߖ: "(ZzSCFC?;4,#ɱzjT1 ˺p.%d)3@DFMgr;?s1mTET 1O "pRjr`˛j- @~>3. "nJ@E@^76/'v`D˜I[ BJjsAB;R¾59C0CƑsU#+E%-wGM `aWz}^'8<vv^ND5ooS@blnf?7u r[+"k >wL AΣh:Ǩ4}U( ~ZQEhE6 !P:'z}r&/|SxD($56q1nGZMil ;C.  hOwjb ' Nm`=IG6ehٻdJGmwr[k T^_;TRzgXFp[:(^a.,c 8aYEy2ȳ(icnV Bvmpk-0.4.0/data/pc102mac.xml0000644000175000001440000000300411572642326014466 0ustar pedrousers vmpk-0.4.0/data/vkeybd-default.xml0000644000175000001440000000133211572642326016070 0ustar pedrousers vmpk-0.4.0/data/hm.html0000644000175000001440000000706011572642326013736 0ustar pedrousers VMPK. Virtual MIDI Piano Keyboard

    VMPK 0.4.0 - Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). This is the version for mobile devices with touch screen and wireless local area network. There is another version of VMPK for desktop computers with similar features, available on the program's website download area.

    VMPK has been successfully tested in Symbian^3, Meego, Linux, Windows and Mac OSX, but maybe you can build it also in other systems. If so, please drop an email to the to the project's mailing list vmpk-devel <vmpk-devel@lists.sourceforge.net>.

    To use this version of VMPK, the mobile device must have a local network connection, usually WLAN, and a computer connected to the same local network. The computer can use WLAN or ethernet when sharing the same local network segment with the mobile device. GSM/GPRS or UMTS communications are not valid for this application. VMPK uses UDP multicast.

    When using a computer with a Linux operating system, you must install one of the following programs

    On the other hand, if you use a computer with Microsoft Windows or Apple Mac OSX, install ipMIDI

    If you use firewalls on your network, please remember to allow UDP traffic with the multicast address 225.0.0.37 and the port number (by default, 21928). It is necessary that both the computer and mobile device share the same port number.

    In addition to the software ipMIDI/QmidiNet that bridges between the local network and the MIDI subsystem, you also need a MIDI synthesizer to produce sound from MIDI events. You can use an external synthesizer device (hardware) connected to the computer, or alternatively a software synthesizer like QSynth, a graphical interface for Fluidsynth running on Linux, Windows and Mac OSX. You can also use the "Microsoft GS Wavetable SW Synth" in Windows, or the Apple Mac OSX DLS Synth. A simple graphical interface for the latter is SimpleSynth.

    This software is in active development. Please contact with the developers team to ask questions, report bugs and propose new features. You can use the tracking system at SourceForge project site.

    Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> and others

    Virtual MIDI Piano Keyboard is free software licensed under the terms of the GPL v3 license.

    vmpk-0.4.0/data/help.html0000644000175000001440000004375711572642326014277 0ustar pedrousers VMPK. Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard


    Introduction

    Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. To do so, connect the other MIDI port to the input port of VMPK.

    VMPK has been tested in Linux, Windows and Mac OSX, but maybe you can build it also in other systems. If so, please drop a mail to the author.

    The Virtual Keyboard by Takashi Iway (vkeybd) has been the inspiration for this one. It is a wonderful piece of software and has served us well for many years. Thanks!

    VMPK uses a modern GUI framework: Qt4, that gives excellent features and performance. RtMIDI provides MIDI input/output features. Both frameworks are free and platform independent, available for Linux, Windows and Mac OSX.

    The alphanumeric keyboard mapping can be configured from inside the program using the GUI interface, and the settings are stored in XML files. Some maps for Spanish, German and French keyboard layouts are provided, translated from the ones provided by VKeybd.

    VMPK can send program changes and controllers to a MIDI synth. The definitions for different standards and devices can be provided as .INS files, the same format used by QTractor and TSE3. It was developed by Cakewalk and used also in Sonar.

    This software is in a very early alpha stage. See the TODO file for a list of pending features. Please feel free to contact the author to ask questions, report bugs, and propose new features. You can use the tracking system at SourceForge project site.

    Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

    Virtual MIDI Piano Keyboard is free software licensed under the terms of the GPL v3 license.

    Getting started

    MIDI concepts

    MIDI is an industry standard to connect musical instruments. It is based on transmitting the actions performed by a musician playing some instrument to another different instrument.  Musical instruments enabled with MIDI interfaces typically have two DIN sockets labeled MIDI IN and MIDI OUT. Sometimes there is a third socket labeled MIDI THRU.  To connect a MIDI instrument to another one, you need a MIDI cable attached to the MIDI OUT socket of the sending instrument, and to the MIDI IN of the receiving one. You can find more information and tutorials like this one all around the Net.

    There are also hardware MIDI interfaces for computers, providing MIDI IN and OUT ports, where you can attach MIDI cables to communicate the computer with external MIDI instruments. Without needing hardware interfaces, the computer can also use MIDI software. An example is VMPK, which provides MIDI IN and OUT ports. You can attach virtual MIDI cables to the VMPK's ports, to connect the program to other programs or to the computer's physical MIDI interface ports.  More details about this coming later. You usually want to connect the MIDI output from VMPK to the input of some synthesizer which transforms MIDI into sound. Another common destination for the connection would be a MIDI monitor that translates MIDI events into readable text. This will help you to understand what kind of information is transmitted using the MIDI protocol. In Linux you can try KMidimon and in Windows MIDIOX.

    VMPK doesn't produce any sound. You need a MIDI software synthesizer to hear the played notes. I recommend you to try QSynth, a graphical front-end to Fluidsynth. It is also possible to use the "Microsoft GS Wavetable SW Synth" that comes with XP. Of course, an external MIDI hardware synth would be an even better approach.

    Keyboard maps and instrument definitions

    VMPK can help you to change sounds in your MIDI synthesizer, but only if you provide a definition for the synthesizer sounds first. The definitions are text files with the .INS extension, and the same format used by Qtractor (Linux), and Sonar (Windows).

    When you start VMPK the first time, you should open the Preferences dialog and choose a definition file, and then select the instrument name among those provided by the definitions file. There should be one instrument definitions file installed in the VMPK's data directory (typically "/usr/share/vmpk" in Linux, and "C:\Program Files\VMPK" in Windows) named "gmgsxg.ins", containing definitions for the General MIDI, Roland GS and Yamaha XG standards. It is a very simple format, and you can use any text editor to look, change, and create a new one. You can find a library of instruments definitions at the cakewalk ftp server.

    Since the release 0.2.5 you can also import Sound Font files (in .SF2 or DLS formats) as instruments definitions, using a dialog available at menu File->Import SoundFont.

    Another customization that you may want to tweak is the keyboard mapping. The default layout maps about two and half octaves for the QWERTY alphanumeric keyboard, but there are some more definitions in the data directory, adapted for other international layouts. You can even define your own mapping using a dialog box available in the Edit->Keyboard map menu. There are also options to load and save the maps as XML files. The last loaded map will be remembered the next time you start VMPK. In fact, all your preferences, selected MIDI bank and program, and the controller values will be saved on exit, and restored when you restart VMPK the next time.

    MIDI connections and virtual MIDI cables

    To connect hardware MIDI devices you need physical MIDI cables. To connect MIDI software you need virtual cables. In Windows you can use some virtual MIDI cable software, like MIDI Yoke, Maple, LoopBe1 or Sony Virtual MIDI Router.

    MIDI Yoke setup process will install the driver and a control panel applet to change the number of MIDI ports that will be available (you need to restart the computer after changing this setting). MIDI Yoke works sending every MIDI event written to an OUT port to the corresponding IN port. For instance, VMPK can connect the output to the port 1, and another program like QSynth can read the same events from the port 1.

    Using MIDIOX you can add more routes between MIDI Yoke ports and other system MIDI ports. This program also provides other interesting functionalities, like a MIDI file player. You can listen the songs played in a MIDI Synth and at the same time see the played notes (only one channel at a time) in VMPK. To do so, you can use the "Routes" window in MIDIOX to connect the input port 1 to the Windows Synth port. Also, configure the player's MIDI port to send to MIDI Yoke 1. And configure VMPK Input port to read from MIDI Yoke 1. The player will send the events to the out port 1, which will be routed to both the input port 1 and at the same time to the synth port.

    In Linux, you have ALSA sequencer to provide the virtual cables. The ports are dynamically created when you start a program, so there is not a fixed number of them like in MIDI Yoke. The command line utility "aconnect" allows to connect and disconnect the virtual MIDI cables between any ports, being hardware interfaces or applications. A nice GUI utility for doing the same is QJackCtl. The main purpose of this program is to control the Jack daemon (start, stop and monitor the state). Jack provides virtual audio cables to connect your sound card ports and audio programs, in a similar way to the MIDI virtual cables, but for digital audio data.

    Frequently Asked Questions

    How to display 88 keys?

    88 is an arbitrary number of keys used by (most) modern piano manufacturers, but organ and synthesizer manufacturers don't always follow this convention. VMPK can be customized to display from 1 to 10 octaves. Using 7 octaves it shows 84 keys, and for 8 octaves it shows 98 keys. There is no way to display exactly 7 and 1/4 octaves.

    There is no sound

    VMPK doesn't produce any sound by itself. You need a MIDI synthesizer, and please read the documentation again.

    Some keys are silent

    When you select channel 10 on a standard MIDI synth, it plays percussion sounds assigned to many keys but not to all of them. On melodic channels (not channel 10) you can select patches with a limited range of notes. This is known in music as Tessitura.

    The "Grab Keyboard" option fails

    It is a known issue for Linux users. This feature works well in KDE3/4 desktops using the standard kwin window manager; it also works with Enlightenment and Window Maker, but fails in Metacity and Compiz window managers, common among Gnome setups. It is also known that using this option prevents normal usage of the drop down menus on GTK2 applications. There is no known solution for this issue, except avoiding the broken scenarios if you really need this feature.

    Patch names don't match the real sounds

    You need to provide an .INS file describing exactly your synthesizer's sound set or soundfont. The included file (gmgsxg.ins) contains definitions for only standard GM, GS and XG instruments. If your MIDI synth doesn't match exactly any of them, you need to get another .INS file, or create it yourself.

    Syntax of the Instrument Definition (.INS) files?

    One explanation of the INS format is here.

    Can I convert my Instrument Definition for vkeybd into an .INS file?

    Sure. Use the AWK script "txt2ins.awk". You can even use the utility sftovkb from vkeybd to create an .INS file from any SF2 soundfont, but there is also a function to import the instrument names from SF2 and DLS files in VMPK.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins
    

    You can find the AWK script "txt2ins.awk" installed in the VMPK's data directory.

    Download

    You can find the latest sources, Windows, and Mac OSX packages at SourceForge project site.

    There are also ready to install Linux packages for:

    Installation from sources

    Download the sources from http://sourceforge.net/projects/vmpk/files. Unpack the sources in your home directory, and change to the unpacked dir.

    $ cd vmpk-x.y.z
    

    You can choose between CMake and Qmake to prepare the build system, but qmake is intended only for testing and development.

    $ cmake .
    or
    $ ccmake .
    or
    $ qmake
    

    After that, compile the program:

    $ make
    

    If the program has been compiled sucessfully, you can install it:

    $ sudo make install
    

    Requirements

    In order to successfully build and use VMPK, you need Qt 4.6 or newer. (install the -devel package for your system, or download the open source edition from qtsoftware.com, formerly Trolltech.)

    RtMIDI is included in the source package. It uses ALSA sequencer in Linux, WinMM in Windows and CoreMIDI in Mac OSX, which are the native MIDI systems in each supported platform.

    The build system is based on CMake.

    You need also the GCC C++ compiler. MinGW is a Windows port.

    Optionally, you can buid a Windows setup program using NSIS.

    Notes for windows users

    To compile the sources in Windows, you need to download either the .bz2 or .gz archive and uncompress it using any utility that supports the format, like 7-Zip.

    To configure the sources, you need qmake (from Qt4) or CMake. You need to set the PATH including the directories for Qt4 binaries, MinGW binaries, and also CMake binaries. The program CMakeSetup.exe is the graphic version of CMake for Windows.

    Notes for Mac OSX users

    You can find a precompiled universal app bundle, including Qt4 runtime libraries, at the project download area. If you prefer to install from sources, CMake or Qmake can be used to build the application bundle linked to the installed system libraries. You can use Qt4 either from qtsoftware.com or the package distributed by Fink.

    The build system is configured to create an universal binary (x86+ppc) into an app bundle. You need the Apple development tools and frameworks, as well as the Qt4 SDK from Nokia.

    To compile VMPK using Makefiles, generated by qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    optionally:
    $ macdeployqt build/vmpk.app
    

    To compile using Makefiles, generated by CMake:

    $ cmake -G "Unix Makefiles" .
    $ make
    

    To create Xcode project files:

    $ qmake vmpk.pro -spec macx-xcode
    or
    $ cmake -G Xcode .
    

    If you need something to produce noise, maybe you want to take a look to SimpleSynth, or FluidSynth (available from Fink). For MIDI routing, there is also MIDI Patchbay.

    Notes for packagers and advanced users

    You can ask the compiler for some optimisation when building the program. There are two ways: first, using a predefined build type.

    $ cmake . -DCMAKE_BUILD_TYPE=Release
    

    The CMake "Release" type uses the compiler flags: "-O3 -DNDEBUG". Other predefined build types are "Debug", "RelWithDebInfo", and "MinSizeRel". The second way is to choose the compiler flags yourself.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .
    

    You need to find the better CXXFLAGS for your own system.

    If you want to install the program at some place other than the default (/usr/local) use the following CMake option:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr
    

    Acknowledgements

    In addition to the aforementioned tools, VMPK uses work from the following open source projects.

    • from Qtractor, by Rui Nuno Capela
      Instrument definition data classes
    • from QSynth, by Rui Nuno Capela
      Knob widget
    • Icon and logo by Theresa Knott

    Thank you very much!

    vmpk-0.4.0/data/vmpk_128x128.png0000644000175000001440000002630111572642326015143 0ustar pedrousersPNG  IHDR>a pHYsgo IDATxy|gUխnՒu[ؖ;dsqL'gC&da`ef`c%. 10k2$!\@pLر>C-UTu%w˒%يԧ~~s}KbJSbUUx<YeYKe+IO$OEH$KȲ$IBN}Z<0,\r ibYib&aimmH$B,ömhi$I4M#L&m0u0뺮,])YYUU/[rӊ1dC5 ]wk:a lIj@B!.DLA)0;9zg{S.` (ʇﭷ/((cGIG lqJB-PIN LaC6QKd(xt,ʟw߭ʲLSS^"$BgL)P< `1WUU݇>!YUU:omeyfŃcޅw3@t6C`g?p? X <32QʴiC)睷9ء %q:4~$ ~0ʕsmH\Q7PܦװGy{o_)LY0p{ W9M}.iF& >76]K.[n!~@>y ѡhv=n c֦;L5k֎뮻k%?qifGL~w7=װpx Mh*;rܹs~%˖-HʠϖK+K<^G+K-Jl'opY84oE}}׮];w.K_zK~mbPK@֨,-t6mm٠vL`[[[[˶-D*4nOR36f8;.Fۀǁ8Kuu?TWW~R^<,(SJ<%@5~ }.֤MLOЦ09s憪~G`A;x!,9- h)Q=N$̠@^qS̙3555^zU>ηBUN3ߓ77 &9%1+g\ vM`7o ֯_,lo\%ҽs#)%ՄzZ A=g.6F@Dk% W pyC!9Q~#/&wL_ŋYbŬ}c pwSsy2(OYlN aȦ>,0 ݆8SQ6]p*.;y]w<ôo/vcoF`u݄:]i.  Ν?ۍ76=Wlq8B:JH9_aSF8+++W,X`>[o>BM[~#`x|Ig l\E P__3җl |X ya}HcAO[_< 3;"/FD-A“U.e̙󙪪M6l,^x)?"g9=VNRg҄ VϟH*).}[p[qLHyZãb"cG]opy) .yiiO?4^ªn`~V{ϭJ`ĢU`7ŬQ]~dX2BTE^?կ%.(8sm=IIEz_ֈbS:.p׮暛|Iz{{Y|qy<fc=܋/ i 03 `5l|!@Yp[k֬YaKpϼqH"-}*_ g^}W_y,<:Ȕ/s~ f w7\>}@t4ǿP^YYy쓟O~hFV-ʼŊLj\M lhNel~\S^^7ͼk|}UdJ҈jǖ!0H|Jd#hݺںkXq2࿻kNٓxxgTl]aa `3===u?O={6w{ƚȒtF|"`_DR+zs:4An%vl}q b+Jt)$IBHB$IRVRBbsYG(އd[NхDF6"]ZeS=b Sb1@ ?EMr!EDr qNK@)f]]Bqfȸ& gdL^ڧZy@ @aa!yJa!G )_Le=Gs /:ZZ)S`&mA!3m"f\D&O6|`T-K+(JDLlMe/( HA]hy} iH-Vy bj~K $>i] \I3+j bM oEhnϖ]S7>phg8!/ٽ{7M>&A, Imo@]@rZp$,:wD\c->@sssfkQs|=5Ir!x㍬YB`7чQ2 ݆eqW WgJٳ)--=KK̽pP=փJ)1:&JdioG~'uSҰ`H@KO<ܭPe2 r<>ZP۷/$<%?O!2~TGYiKqVE׀ΫA,=n-.İltK842HDҴl۶EVX4i8ޣv'p|/ gcD?yeTW2~ $$d O)7E!)qdzE^~?̱c̘s){X\ti1,ܩ-Ӓl|X"3۴̧p: fl%@K湟eP||~Ý`fǒϠlg}"QUW^ᢪiP]Pr`CΝGeF_dI h;M-+=tD[nh@3KS湾Sˣ 2_bmnPʃyydY(AQ$QR@2e= (4x?X%{Zȩ}eN-Sxɔ櫨@,p̀,I[(þoGn_iY@t[y ;v0QAmA"HY,@p 8lq"'N@yF ޣO Lj7s2ޖIfFư:I܋GaA+f۾v|2 q,.oسhgn?z BE#:mLdf5C( 8|0zU5 產+YEafQ> %(2Et^=_} 5|n1 cL1gCY :p׎De \h`Yv%)S lᲥKE^T**zRqH6XFmK498bך䵓!~Ǽ曃$ñ^B6R5h>|YAyN f$S~8Ӥ(";QxUYNeG\!Pd/ls YHBqSNEÂS-$7CA8HAYŽc]/K2^fvi1ݮRoJ@K?B~d2I<GӴ h@!/,"z< G2؃{2 8ܝ$T6M# Je4C0sSiaF1x`_*m`@І4BQkL83xz~JKKmX,x|T)+$ {`#L ö ks0-gL?$!8ϴi%a){[u-#zuǫ ~wvlQ Gƣ8h ځ0ezD"IUHE-^pHWC+6 ƔƙzDٔæi0,ZH$B{{; GUe%(s!//[P/sq":}*yWvҳ48y$TNS% 4] L@[n/<|lE9~UFQ$f9ҝ=.;E[[ۘ2u0Z_9;N ȩl 6m,^X,FKK ǏgDL&9V~L$OGaAmK,ѝLb-%'Pm ݲS%J>* Ty$Ǫ}PT1b̛7Hk/p"gaY QQQ1ȌbG8E3ۨ]ש@Qn`P(ĴiXx1dǏs1ZZZF % 8Y@@ 0S])_.P$Aӛx5-JYP t'/aH6s )YHG[ ]>[Q<^?t+9aoDo[@)Ѿmۣ7m$'F$ (**iG+dWPP Xhir19Bss3)js؇ "aEU/YƯ*T  emLxMցG4Wl4Y,5Ol{OߊڗFKK q7œ79U9}:@4+0\p&(̙üye'No>C8ym<l޼ݻwӯ/ɦ\8XDPp%1*EQPǃmmmڵiӦQ[[K(:cl00\p9sLXz5455{ӂRjؽ{yvhAw~ Ӆ@ko[oR?w^;hoo~|>ӧOgΜZ-[Ǝ; /Ν; BQ^^>,a}jjjo]v;pȑ4m]RR( =P-$I' 444c&h^z/~\}լY{'8p_nƮ]yg('??n.;vpKuu5L6JM1t)//禛n[o%b>`0Ȍ38zo$iPPPa>|F|I~~ڵkvZ֭[UW]Euu5{졹e: *UUU]IꢩJf͚E]]ݰJIk;0$ E]l}ݻwӟt}.*cYi$ UUٳg{uժ*}tzj>g?Y6oƍoT7bW>,'|>-fٲe:t~07ro̙3⋩9%IxQuF-@2GE/(J\alݺ˲gk塇˗|rqy6n??q7mFYYlEQib(⩧[W]uG⋹袋?y^{56nUW]żyXnYjՠ믿8|0 X4M=z&^}U.b,YŒ3FYRRff<:\(» b'(@ ܥ7T "^8pmo>>O!஻&b VX ~ƍY~=wqG+`ڿ?H$ۘϾ}/~[oEKK itR.체r JJJBxhii9ֱm%rtqˮGT= \3t8@' R\\Ri>[Q^z%~ifΜɺu(((F9¦Mx衇B8(*btH{{h;x<ƾ}رc[n+%Kd5"4Mc$ !L]DRTTČ3ȥǧb` J0[ gJ 07)4H$B4fe93a(e}vx z{{E\|`ѢE/2Ѐg̙,\}tӍ̜yd` I*++Yd)ee477k.^{5:::ϧ,}mӧOD"G?LrJؼy3ir뭷ԔnH$:9eFgsI&Aqq12ח.}7OII s˗/G$V\ʕ+g??wMcc#WJ~ gIDAT_}iѢE,ZpP:;;Ŷm$I" Fyx'ذa`koZ[[Yn]^`Y]N yuegu" QZZI[LNӉF,Y?СClڴ'x@ @cc#t$?qYp!gϦL99scg{1$<mN8mۆz8ry+ NފPZZJee% ۶KnUV m淿-7ncݺuvm:(jkkڵ͛7m6*++Au>LSSӤ򗿜OtGR26Yb۶1ciM9R@l?HI/۳g綾^ɓ^–ZZZBRUUNRPn$Io /PYYɃ>ȋ/ŋKx{ERʍiBϘ׉#ܹsV\k̚5;v3 )#":N#plNs ]]]yDQ֮]lܸ=L m+"ˡPhe:{qif&ep¡i\Sؼy3'N읦i,Z]߅E8BGGQVVh6KMV{ÆaZ@qؾ};oعs'@UU,BgϞC?ݙqpi"R岎].C/ꫯr4ɓ*7 ]%!q`Ly%I:l۶nYo&kbcJq^sz4snپ};tvv1MBp 7:&M '-`mۆa Πoy]PF3ih4i\Wv}v?,+ ɓ'wg'3j{zz躞UmXeș,8|P[p^MfFUUf̘-[{5^got]OJP(o= 7bC5Ree Htuuqs]9_y] VF4X,& -2WzmۖRQii)-JRbo-'p^Pˑt ړx\1 4sL},>(x<̝;L*Nc(뮻e˖ <㼠HŞI4M&@d@J'L4 f\ߜ6+UUUի?͕W^sZF]W4-zo Hu]NY,710$Iw;rv,@ w>8\5}J , ˲@+&4,%H5`Lqs GQH$aYVB9s&⼺sMڶ-)@k"P1e3+8zP~ĉr!aYV(\Be @ʑ2żY_jH`Qa@[A=bYZ DB|I۶9bauM7̇J4 [uiYާou]7mێ -cx0 |xaHWBcFeY A#W8pH #$D@2,ˊ81VZ\%q]n$iu]OsX"?}9:W4öm'q@ޏSI1D13=itm: @^}d>X12pMef! u] eG}@\toooD"3Up*}bF̌ݴiia~.@9'omx-!zL8 Ҁ Lus.g c [aD&˼6 Ty/(LmLMʀr iXm On3 8Coz.0r7pVxjx"r`rhs!{z7Tn;CiY& !O !F:,{öYnmBxr1M`|~Ι QL쁂%fǘ˯\o(F?Wގ4g`Fg . [`YV60I"groH$4 ]IBD<+AɤjY= vmpk-0.4.0/data/vmpk_16x16.png0000644000175000001440000000136511572642326014776 0ustar pedrousersPNG  IHDRabKGD pHYs B(xIDAT8˝Mhn6|! HKN !4 V6]Q փMݤ4Sm<˖ $ɋf100躎E"pAp ϤR)O>799(J%,bbbaY__{C=Rm׊⟫FSSSlllBT" ]>yȵZm) B0744X#VV*{F0^zgig5M+| a\,wGJl6m ]l6[Z\q&bS Ύ(J7P7 ֑eYgu.@m 4xi{8S .xIENDB`vmpk-0.4.0/data/vmpk_48x48.png0000644000175000001440000000600411572642326015003 0ustar pedrousersPNG  IHDR/0#bKGD pHYs B(x IDATh͘{p\u?%klYX5a i;  Cdvt:C&Nt-!3s9gs(,LUSS77l`(B>i-Hi\.vGE-SSS=55z|ժUhnn~!;9/%kS8ChaYE'J2<'$oq:;5kwu38_'%E_2λӗ}[ϑ[ٴi;w^ e+!%9; -}N;vzMk}6);CQ*Hd@+U$'\/Ϛ:J%lxSOLcIIZhT͑/!]9iqt>Sk׮޴i,M ^q jU/ % 82 m 0tǀ ~ݺu_Ν7q*{=b .M SO3vW? -[<<}:NoϹŵ9gqogWy`_8Qb\qUU_v=w|겁SWV,PӴraZfe~>gP?1PZH }rlP9E&mQJ/0(VHm2ek׬9pW+/8?[)m{0Q|*!9O)-oH$eHG=snk_L i2Wpz hҶml& Q`-U/J'y'Ɋ<ي% e]8]+|%p%K붻]z_HA* i5EQ$($WV_uaxy &OQzf |)?2oeXX* +t aEר=Q{p(͗f B'T9Am , UEr_q>.F{KSJHhF k${9.hX!E0{z~' oORJ"Lj_T/Bp }!ə *h]y%!W@UD%T! 8t*Ͻ1ǾSFu2|@QR`éh ].@Vٽ IBLcQ4JHxv~85aH3@EEmR惯4 jjjDfH.#Ns…9hR&i.0>xPGU$t*!+#VQ* 1Xth Yamtzu񊂦il7(J4VEazz DZ!0wmL^:B{XK𣣣R)nEʕ+;u `lb 4E!QUEuH%)RKAdҒ)_JO`W#jmܡE+oG"/466L&inn4M|u!Ŀr]iyf|A2 &O399tuuq^X,6d2ݲ, `٧+BxXLru) |tttpY6n֭[蠯ZvI[[DQP(Ȋ+x<᫪Xd x0AJikX2$LFoG `֭z pqx iooȧR)I$DQߏScWj^ [u]MKeQ(fҥ<s=ݻNe3Chp~_ "_O:c{WQڇW oF7=!+d2? 3qE!q@ܲ, x-0eYm׎㠪jI6+b SV'@w4^ image/svg+xml vmpk-0.4.0/data/vmpk.svg0000644000175000001440000010114611572642326014142 0ustar pedrousers vmpk-0.4.0/data/vmpk_symbian.svg0000644000175000001440000020537411572642326015674 0ustar pedrousers image/svg+xml vmpk-0.4.0/data/pc102x11.xml0000644000175000001440000000301411572642326014340 0ustar pedrousers vmpk-0.4.0/data/help_de.html0000644000175000001440000005032011572642326014727 0ustar pedrousers Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard



    Einleitung

    Virtual MIDI Piano Keyboard ist ein MIDI-Generator und –Empfänger. Er produziert selbst keinen Sound, aber kann genutzt werden, um einen MIDI-Synthesizer (Hard- oder Software, intern oder extern) anzusteuern. Sie können die Tastatur benutzen, um MIDI-Noten zu spielen, ebenso wie die Maus. Man kann Virtual MIDI Piano Keyboard benutzen, um gespielte MIDI-Tasten von anderen Instrumenten oder MIDI-Datei-Playern mit zu verfolgen. Verbinden Sie dazu einfach den anderen MIDI-Port mit dem Eingangs-Port des VMPK.

    VMPK wurde in Linux, Windows und Mac OSX getestet, aber vielleicht können Sie es ja in andere Systeme einbauen? Wenn ja, schreiben Sie doch dem Entwickler eine E-Mail.

    Das Virtual Keyboard von Takashi Iway (vkeybd) war die Inspiration hierfür. Es ist eine wunderbare Software und hat uns viele Jahre gut gedient. Danke!

    VMPK basiert auf einer modernen Grafik-Oberfläche namens Qt4, die exzellente Eigenschaften und Leistung bietet. Die MIDI Input/Output-Features stammen aus RtMIDI. Beide Oberflächen sind frei und systemunabhängig, verfügbar für Linux, Windows und Mac OSX.

    Das alphanumerische Tastaturlayout kann innerhalb des Programms konfiguriert werden, und die Einstellungen werden in XML-Dateien gespeichert. Einige Layouts für spanische, deutsche und französische Tastaturen – Übersetzungen aus VKeybd – liegen schon bei.

    VMPK kann Programm-Änderungsbefehle und Controller an einen MIDI-Synthesizer senden. Die Definitionen verschiedener Standards und Geräte können als .INS – Dateien erstellt werden, dieses Format wird auch QTractor und TSE3 benutzt. Es wurde von Cakewalk entwickelt und auch in Sonar benutzt.

    Diese Software befindet sich noch in einer sehr frühen Alpha-Phase. Schauen Sie in die TODO-Datei für eine Liste von unfertigen Features. Die Autoren würden sich über Fragen, Fehlermeldungen und Vorschläge sehr freuen. Sie können das Tracking-System der SourceForge Projektseite benutzen.

    Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

    Virtual MIDI Piano Keyboard ist Libre-Software, lizensiert unter den Bedinungen der GPL v3 Lizenz.

    Loslegen

    Was ist MIDI?

    MIDI ist ein Industriestandard zur Verbindung von Musikinstrumenten. Er basiert auf der Übertragung der Aktionen eines Musikers auf ein anderes Instrument. Musikinstrumente mit MIDI-Schnittstellen haben typischerweise zwei DIN-Steckplätze, die mit MIDI IN, beziehungsweise MIDI OUT bezeichnet sind. Manchmal gibt es auch einen dritten Steckplatz, MIDI THRU. Um MIDI-Instrumente zu verbinden braucht man ein MIDI-Kabel zwischen dem MIDI OUT des sendenden und dem MIDI IN des empfangenden Instruments. Mehr Informationen und Tutorials wie dieses finden sich überall im Netz.

    Es gibt auch Hardware-Schnittstellen zur MIDI-Nutzung auf Computern, die MIDI IN und OUT zur Verfügung stellen, und an die dann MIDI-Kabel angeschlossen werden. Dies ermöglicht dem Computer die Kommunikation mit externen MIDI-Instrumenten. Auch ohne MIDI-Hardware können Computer MIDI-Software intern benutzen. VMPK ist ein Beispiel für die Bereitstellung von MIDI IN und MIDI OUT – Kanälen. VMKP bietet virtuelle MIDI-Kabel, mit denen das Programm mit anderer Software oder der MIDI-Hardware des Computers verbunden werden kann. Dazu später mehr. Normalerweise wird VMPKs MIDI OUT mit dem Eingang eines Synthesizers verbunden, der dann das MIDI-Signal in Töne umwandelt. Eine weitere übliche Verbindung wäre die mit einem MIDI-Monitor, der MIDI-Daten in lesbaren Text umwandelt. Dies ist nützlich, um die Information zu verstehen, die vom MIDI-Protokoll übertragen wird. Unter Linux können Sie KMidimon, ausprobieren, oder unter Windows MIDIOX .

    VMPK produziert keine Töne. Für diese braucht man einen MIDI Software-Synthesizer, um die gespielten Noten zu hören. Ich empfehle QSynth, eine graphische Benutzeroberfläche für Fluidsynth. Es ist auch möglich, den „Microsoft GS Wavetable SW Synth“ zu benutzen, der in XP zu finden ist. Natürlich wäre ein externes MIDI Synthesizer-Gerät eine noch bessere Lösung.

    Tastaturlayouts und Instrumentendefinitionen

    VMPK kann helfen, Sounds in deinem MIDI Synthesizer umzuschalten und zu verändern. Hierzu muß eine Instrumentdefinitionsdatei definiert sein. Diese Definitionen sind Textdateien mit .INS-Endung, dasselbe Dateiformat, das auch von Qtractor (Linux) und Sonar (Windows) verwendet wird.

    Bei der ersten Benutzung von VMPK sollte der Einstellungen-Dialog geöffnet werden, um eine .INS Definitions-Datei auszuwählen. Damit kann man dann das Instrument unter den zur Verfügung stehenden Instrumenten aussuchen. Eine Instrumenten-Definitionsdatei sollte im VMPK-Installationsordner zu finden sein (normalerweise: "/usr/share/vmpk" in Linux, oder "C:\Program Files\VMPK" in Windows). Diese Datei namens gmgsx.ins beinhaltet Definitionen für General MIDI, Roland GS und Yamaha XG Standards. Es ist ein sehr einfaches Format, und man kann es mit jedem Textverarbeitungsprogramm ansehen, verändern oder neue Dateien erzeugen. Es gibt eine Bibliothek mit Instrumentendefinitionen auf dem cakewalk FTP-Server.

    Seit der Version VMPK-0.2.5 können auch Sound Font – Dateien (.SF2 oder DLS –Dateiformat) als Instrumentendefinitionen importiert werden. Dazu benutzt man am besten den Menüpunkt Datei -> SoundFont importieren.

    Eine weitere mögliche Personalisierung ist das Tastaturlayout. Das normale Layout deckt mit der QWERTY-Tastatur etwa zweieinhalb Oktaven ab, aber es gibt einige andere Definitionen im Installationsordner, die auf andere internationale Tastaturanordnungen angepasst sind. Man kann sogar seine eigenen Layouts erstellen, wenn man den Menüpunkt Edit -> Keyboard Map nutzt. Es gibt auch die Option, die Layouts als XML-Dateien zu laden und zu speichern. Alle persönlichen Einstellungen, die ausgewählte MIDI-Palette und das MIDI-Programm, sowie die Controller-Werte werden bei Programmschluss gespeichert und beim nächsten Programmstart wiederhergestellt.

    MIDI-Verbindungen und virtuelle MIDI-Kabel

    Um MIDI-Geräte zu verbinden brauchst man richtige MIDI-Kabel. Um MIDI-Software zu verbinden, sind nur virtuelle Kabel nötig. Für Windows gibt es einiges an Software dafür, so zum Beispiel MIDI Yoke, Maple, LoopBe1 oder Sony Virtual MIDI Router.

    MIDI Yoke installiert einen Treiber und ein Bedienfeld, mit dem die Anzahl der MIDI Ein- und Ausgänge verändert werden kann (der Computer muss nach der Änderung dieser Einstellung neu gestartet werden). MIDI Yoke funktioniert folgendermaßen: Jede MIDI-Aktion wird an einen AUSgang gesendet, der mit einem EINgang übereinstimmt. Man kann den VMPK Ausgang mit Buchse 1 verbinden, und ein anderes Programm wie QSynth kann genau diese Aktionen dann aus Buchse 1 ablesen.

    MIDIOX kann mehr Routen zwischen MIDI Yoke-Buchsen und den MIDI-Buchsen anderer Systeme erstellen. Dieses Programm beinhaltet außerdem weitere interessante Funktionen, zum Beispiel einen MIDI-Player, mit dem man gleichzeitig Songs in MIDI Synth anhören und in VMPK die gespielten Noten sehen kann (jeweils nur ein Kanal). Dazu kann man das „Routen“ – Fenster von MIDIOX benutzen, um den EINgang 1 mit Windows Synth zu verbinden. Stell die MIDI-Buchse des Player so ein, dass sie an MIDI Yoke 1 sendet. Und stell den VMPK EINgang so ein, dass er von MIDI Yoke 1 gespeist wird. Der Player sendet die Aktionen an den AUSgang 1, der gleichzeitig mit dem EINgang 1 und der Synth-Buchse verbunden ist.

    Für Linux gibt es den ALSA-Sequenzer, der virtuelle Kabel beinhaltet. Die Buchsen werden dynamisch erstellt, wenn das Programm startet, so dass es keine festgelegte Nummer wie in MIDI Yoke gibt. Das Befehlszeilen-Programm „aconnect“ ermöglicht die Verbindung und Trennung der virtuellen MIDI-Kabel zwischen den Buchsen, egal ob Hardware-Schnittstellen oder Programme. Eine hübsche grafische Oberfläche, die ebenfalls virtuelle MIDI-Verbindungen ermöglicht, ist QJackCtl. Der Hauptzweck dieses Programms ist die Verwaltung (Starten, Stoppen, Überwachen) des Jack daemon. Jack stellt virtuelle Audiokabel zur Verfügung, die die Soundkarte mit den Audioprogrammen verbinden, ähnlich wie die virtuellen MIDI-Kabel, aber für digitale Audiodaten.

    Häufig gestellte Fragen

    Wie stellt man 88 Tasten dar?

    88 ist eine willkürlich gewählte Zahl an Tasten, die von den (meisten) modernen Pianoherstellern verwendet wird, der aber Orgel- und Synthesizerhersteller nicht folgen. VMPK kann so eingestellt werden, dass zwischen einer und zehn Oktaven dargestellt werden. Bei sieben Oktaven werden 84 Tasten dargestellt, bei 8 Oktaven sind es dann 98. Es gibt keine Möglichkeit, genau 7 ¼ Oktaven darzustellen.

    Es kommt kein Ton

    VMPK erzeugt selbst keine Töne. Sie brauchen einen MIDI Synthesizer, und bitte lesen Sie diese Anleitung nocheinmal.

    Einige Tasten bleiben stumm

    Wenn Kanal 10 auf einem Standard-MIDI-Synthesizer eingestellt ist, spielt er Percussion-Sounds auf einigen Tasten, aber nicht auf allen. Auf melodischen Kanälen (also allen außer Kanal 10) kann man verschiedene Töne innerhalb eines begrenzten Notenbereichs (patches) auswählen. In der Musik nennt sich das Tessitura.

    Die “Grab Keyboard” – Option versagt

    Das kommt häufiger bei Linux-Nutzern vor. Die Option funktioniert gut bei KDE3/4 desktops, die den Standard-kwin Fenstermanager benutzen. Sie funktioniert auch mit Enlightenment und Window Maker, allerdings NICHT mit Metacity und Compiz, die häufig bei Gnome-Setups vorkommen. Es ist ausserdem bekannt, daß diese Option die normale Benutzung von Ausklappmenüs in GTK2-Anwendungen behindert. Es gibt keine bekannte Lösung für dieses Problem, außer die Fehlerentstehung zu vermeiden, wenn man diese Option wirklich unbedingt braucht.

    Patch-Namen stimmen nicht mit den wirklichen Sounds überein.

    Es muß eine .INS-Datei angegeben werden, die das Sound Set oder den Soundfont des Synthesizers genau definiert. Die mitgelieferte Datei (gmgsx.ins) beinhaltet nur die Definitionen für Standard GM, GS und XG-Instrumente. Wenn der gespielte MIDI-Synthesizer nicht genau auf einen dieser Standards passt, muß man sich das entsprechende .INS-File besorgen, oder eines selbst erstellen.

    Wie sieht die Syntax der Instrumentendefinitionen (.INS) aus?

    Eine Erklärung des INS-Formates gibt es hier.

    Kann ich meine Instrumentendefinition für vkeybd in ein .INS-File umwandeln?

    Sicher. Hierzu benutzt man einfach das AWK-Script “txt2ins.awk” Es kann sogar die sftovkb-Anwendung von vkeybd benutzt werden, um aus jeder beliebigen SF2 SoundFont-Datei eine .INS-Datei zu erstellen, aber es gibt auch eine Funktion, um Instrumentennamen aus SF2 und DLS – Dateien in VMPK zu importieren.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins

    Das AWK-Script “txt2ins.awk” befindet sich im VMPK-Installationsordner.

    Download

    Die neuesten Quellen, Windows und Mac OSX – Pakete gibt es auf der SourceForge Projektseite.

    Es gibt auch installationsfertige Linux-Pakete für:

    Installation aus Quellen

    Die Quellen werden von http://sourceforge.net/projects/vmpk/files heruntergeladen. Man entpackt sie dann in das Benutzerverzeichnis und wechselt in das entpackte Verzeichnis.

    $ cd vmpk-x.y.z

    Bei der Vorbereitung des Erstellungsprozesses kann zwischen Cmake und Qmake gewählt werden, dabei ist Qmake aber eher für Tests und Entwicklung vorgesehen.

    $ cmake .
    or
    $ ccmake .
    or
    $ qmake

    Danach das Programm kompilieren:

    $ make

    Sobald das Programm erfolgreich kompiliert wurde, kann es installiert werden:

    $ sudo make install

    Voraussetzungen

    Um VMPK fehlerfrei kompilieren und benutzen zu können, benötigt man Qt 4.6 oder eine spätere Version, d.h. man installiert am besten die entsprechenden -devel Pakete, die von der Linuxdistribution bereitgestellt werden. Die Opensource Qt Pakete können auch direkt von qtsoftware.com (ehemals Trolltech) heruntergeladen werden.

    RtMIDI ist in dem Quellpaket enthalten. Es basiert auf dem ALSA-Sequenzer in Linux, WinMM in Windows und CoreMIDI in Mac OSX, die die jeweils eigenen MIDI-Systeme in den Plattformen sind.

    Das Erstellsystem basiert auf CMake.

    Man braucht außerdem den GCC C++ - Compiler. MinGW ist eine Windows-Version davon.

    Alternativ kann auch ein Windows Setup-Programm mit NSIS erstellt werden.

    Hinweise für Windows-Benutzer

    Um die Quelldateien für Windows zu kompilieren, lädt man entweder das .bz2 oder das .gz Archiv herunter und entpackt es mit einem Hilfsprogram, das dieses Archivformat unterstützt, z.B. 7-Zip.

    Vor dem Erstellen muß das Quellpaket konfiguriert werden, dies geschieht entweder mit qmake (von Qt4) oder CMake. Die Verzeichnisse für die Qt4 Binärdateien, MinGW Binärdateien und die CMake Binärdateien müssen der PATH Umgebungsvariable hinzugefügt werden, wenn dies nocht nicht der Fall ist. Das CMakeSetup.exe Programm ist eine graphische CMake Version für Windows.

    Hinweise für Mac OSX-Benutzer

    Das Erstellungssystem ist so konfiguriert, daß es eine universelle Binärdatei (x86+ppc) in ein App-Paket umwandelt. Man braucht dazu die Apple Development Tools und Frameworks, außerdem den Qt4 SDK von Nokia oder Fink.

    Um ein Makefile für VMPK zu erstellen, banutzt man entweder Qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    optionally:
    $ macdeployqt build/vmpk.app

    oder CMake:

    $ cmake -G "Unix Makefiles" .
    $ make

    Um Xcode Projektdateien zu erstellen:

    $ qmake vmpk.pro -spec macx-xcode
    or
    $ cmake -G Xcode .

    Zur Klangerzeugung kann man zum Beispiel SimpleSynth oder FluidSynth benutzen. Für das MIDI-Routing gibt es auch MIDI Patchbay.

    Hinweise für Packager und fortgeschrittene Benutzer

    Die Kompilierung kann mit Optimierungen geschehen. Dazu gibt es zwei Wege: Erstens, die Benutzung eines vordefinierten Erstelltyps.

    $ cmake . -DCMAKE_BUILD_TYPE=Release

    Der Cmake “Release”-Typ nutzt die Compiler-Flags: „-O3-DNDEBUG“. Andere vordefinierte Erstelltypen sind „Debug“, „RelWithDebInfo“, und „MinSizeRel“. Der zweite Weg ist, die Compiler-Flags selbst zu wählen.

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .

    Die besten CXXFLAGS sind vom jeweiligen System abhängig, und sollten dementsprechend ausgesucht werden.

    Falls das Programm an einer anderen Stelle als dem Standardverzeichnis (/usr/local) installieren werden soll, benutzt man die folgende CMake option:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr

    Danksagungen

    Zusätzlich zu den bereits genannten Tools benutzt VMPK auch Teile der folgenden Open Source Projekte.

    Vielen Dank!

    vmpk-0.4.0/data/list-add.svg0000644000175000001440000005222211572642326014666 0ustar pedrousers image/svg+xml vmpk-0.4.0/data/vmpk_64x64.png0000644000175000001440000001073711572642326015007 0ustar pedrousersPNG  IHDR>@BbKGD pHYs B(xIDAThyp]}?no.K,[62ۉMphӤ! 13tJ'LJN$ C 6Yl$ےX{OһBgzfh]ι~HpN4okkkSx\:[Gh4 d҈㎦i#egg3gk\z=yG!+-L&Xftz<iNlǣ?m18<ܨs-W3fxN-qxLW%xR"%X#$7uYf+G~⾍hIxz2>$'7\̛7oG}}_)K>Jx=;@&R#Б%K;5ΞPYp"lt!@ @D&.Izkڻ{usT'ۉ* !!g{TJC! _2CN sAAWWWϞ?qu/E \ad}\fڗ! n^O#MO?N\wgΜKn[xQ?zv?=:aMApOϿޝH8~?}˖-קss*0fS:@kgz]ɥ%ᗟfq5 ҟ t`gΖ/__M 2w)Ȍiw=;@4'E8IѴ&<-xNsM5z~ӸG.@Oi֣%XޘÜֵҸ뮻>c+'B7NOHPu[ת֭[ws>b'E+H$*PF!!m{/3}I[AOP \Z]9K;n}߃GzO"𤼤 ddEyߑGܧ8 <,Z"% ~qqqihT|TEESj¼k>Gic޹%뷀g>5550ɭFJ_/\4(j| gkPRC)$n p8|dB>x?4vd4kٝt5$}8a{Ґ'|\Iʓ Y@B!L9vU/WcJtԐ'no"ۮo;/V@1| >[Dr4UU-5E4jv1N7󹅳>)i"*DtJUɎ ڬޞ!T/^ڙxw<<Dpڅ*4 LQM#tAt`=CaX.wUP_"14g4Ag¦# T(2"ɡr]ʢ-7j`긚T*XRrp~QIr2m0m7CV5TMH|t zܡ0 M M<bA]B(2TWnf>'Qbmy *%|-ƃ1-CQ@YuAj;}j> v1M*N~ i[(JUO2t7{(* Zz2خdӦ=*Jp8t: Ƞ d|o̠&Bi#" mq!+|XȠFl '*73lcGP)x]FQE0 8Sf JGooØÃ$Iq]-L x5E!* Ub!ACR0D50ELI&e;谳9Em۱Ǎ; 8)"daL>UU룫VZژT^NɓF6TO;^E\&R,LQT@4 V\_wpYlώҖ(z3\0Ig:` EbɄBs,@(hԩSC4z{{imme%{z<aJN8ASSgϞ2 )(`c#ھֱ;W@AAż.`c*gӦMcTVVF*0 ***e;RYY) A1w}7dF:Č3X~=6lĥEEB0 RPP#<޽{9rsaݺuv˖-W^P(ԩS)++c jjjXv-PUUEyy9 8m$$}vnx VXC=D:瞣+Wb GaѢEZnvEww7hYfay STTDUUeHMsAo%X4ٺu+7t˗/f׮]<3=Æ 8~8o&Jā4)S0gΜ(++cppL<g&lw۶m+|rxxxn:c%%%466Ļ͛Yt)?555lٲiӦ}H$޽{)((o4MZZZؽ{7p-0us ON(7x#w˹)͠5MPUx"׃*jk $t۶(JO u)ղӗ\cBWl4Lf$_@f> !DXJ l n&3h\'-'x٪02BCJf*X:ch2 eY_q˲6Q7 캀9v$ؔw@GpcD&h #9 pP\/Oye\]Q'A$o;숓Mzkjl}'?Hy,ڎW.},󼟙iZm9ࡀ˖K| xnRH&q_3SǶ b0/[ٕȃz+\Xx|}ڞ={:9<µmQV^5`VIENDB`vmpk-0.4.0/data/hm_es.html0000644000175000001440000000746511572642326014436 0ustar pedrousers VMPK. Teclado de piano MIDI virtual

    VMPK 0.4.0 - Teclado de piano MIDI virtual

    El teclado de piano MIDI virtual (VMPK) es un generador y receptor de eventos MIDI. No produce ningún sonido por si mismo, pero puede ser usado para dirigir un sintetizador MIDI (ya sea hardware o software, interno o externo). Esta es la versión para dispositivos móviles con pantalla táctil y conexión a una red local (normalmente wireless). Existe otra versión de VMPK para ordenadores de escritorio con características similares, que puede obtener en la página web de descargas del programa.

    VMPK ha sido probado satisfactoriamente en Symbian^3, Meego, Linux, Windows y Mac OSX, pero quizá pueda construirlo en otros sistemas. En tal caso, por favor envíe un mensaje a la lista de correo electrónico del proyecto vmpk-devel <vmpk-devel@lists.sourceforge.net>.

    Para usar esta versión de VMPK, el dispositivo móvil debe contar con conexión a una red local, normalmente WLAN, y un ordenador conectado a esa misma red local. El ordenador puede utilizar WLAN o ethernet, siempre que comparta el mismo segmento de red local con el dispositivo móvil. Las comunicaciones GSM/GPRS o UMTS no son válidas para esta aplicación. VMPK utiliza el protocolo UDP multicast.

    Si utiliza un ordenador con el sistema operativo Linux, deberá instalar en el mismo uno de los dos programas siguientes:

    Por otro lado, si utiliza Microsoft Windows o Apple Mac OSX, instale ipMIDI

    Si utiliza firewalls en su red local, no olvide permitir el tráfico UDP para la dirección multicast 225.0.0.37 y para el puerto utilizado que por defecto es el 21928. Es necesario que tanto el ordenador como el dispositivo móvil compartan el mismo número de puerto.

    Además de uno de los programas ipMIDI/QmidiNet que hacen de puente entre la red local y el subsistema MIDI, necesitará un sintetizador MIDI para producir sonido a partir de los eventos MIDI. Puede usar un dispositivo sintetizador externo (hardware) conectado al ordenador, o alternativamente un sintetizador software como QSynth, un interfaz gráfico para Fluidsynth que funciona en Linux, Windows y Mac OSX. También es posible usar el "Microsoft GS Wavetable SW Synth" en Windows, o el Apple DLS Synth en Mac OSX. Un interfaz gráfico sencillo para este último es SimpleSynth.

    Este software está en desarrollo activo. Por favor, contacte con los desarrolladores para hacer preguntas, informar de fallos, y proponer nuevas funcionalidades. Puede usar el sistema de seguimiento en el sitio del proyecto de SourceForge.

    Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net> y otros

    Virtual MIDI Piano Keyboard es software libre bajo los términos de la licencia GPL v3.

    vmpk-0.4.0/data/txt2ins.awk0000644000175000001440000000221011572642326014553 0ustar pedrousers# This AWK script creates an INS (instruments definition) file from # an instrument list like the file "vkeybd.list" provided with vkeybd, # or a similar one created from scratch or with the help of the # sftovkb utility. # # usage example: # awk -f txt2ins.awk vkeybd.list > translated.ins BEGIN { print ".Patch Names" b="" } { if (b!=$1) { print "\n[Bank" $1 "]" a[$1]=1 b=$1 } print $2 "=" $3,$4,$5,$6 } END { print "\n.Controller Names" print "\n[Standard]" print "1=1-Modulation" print "2=2-Breath" print "4=4-Foot controller" print "5=5-Portamento time" print "7=7-Volume" print "8=8-Balance" print "10=10-Pan" print "11=11-Expression" print "64=64-Pedal (sustain)" print "65=65-Portamento" print "66=66-Pedal (sostenuto)" print "67=67-Pedal (soft)" print "69=69-Hold 2" print "91=91-External Effects depth" print "92=92-Tremolo depth" print "93=93-Chorus depth" print "94=94-Celeste (detune) depth" print "95=95-Phaser depth" print "\n.Instrument Definitions" print "\n[" FILENAME "]" print "Control=Standard" for (i in a) { print "Patch[" i "]=Bank" i } } vmpk-0.4.0/data/help_nl.html0000644000175000001440000005025211572642326014754 0ustar pedrousers VMPK. Virtual MIDI Piano Keyboard

    Virtual MIDI Piano Keyboard


    Introductie

    Virtual MIDI Piano Keyboard is een MIDI-eventgenerator en -ontvanger. Het programma produceert zelf geen geluid, maar kan worden gebruikt om een MIDI-synthesizer aan te sturen (zowel hardware als software, intern of extern). U kunt het computertoetsenbord en/of de muis gebruiken om MIDI-noten te spelen. Daarnaast kunt u VMPK gebruiken om MIDI-noten weer te geven die worden afgespeeld door een ander instrument of door een programma om MIDI-bestanden af te spelen. Maak, om dat te doen een verbinding van de andere MIDI-poort naar de ingangspoort van VMPK.

    VMPK is getest in Linux, Windows en Mac OSX; mogelijk kan het ook worden gecompileerd op andere systemen. In dat geval stelt de auteur het zeer op prijs als u hem op de hoogte stelt.

    Het virtuele keyboard door Takashi Iway (VKeybd) is de inspiratie geweest voor dit virtuele keyboard. Het is een wonderbaarlijk programma en heeft vele jaren goede diensten bewezen. Erg bedankt!

    VMPK gebruikt Qt4, een modern GUI-framework dat erg veel mogelijkheden en hoge performance biedt. RtMIDI biedt daarnaast MIDI-input/-outputmogelijkheden. Beide frameworks zijn open source en platformonafhankelijk, beschikbaar voor Linux, Windows en Mac OSX.

    De alfanumerieke toetsenbordtoewijzing kan worden geconfigureerd via de GUI van het programma, de instellingen worden opgeslagen in XML-bestanden. Voor een aantal toetsenbordindelingen (Spaans, Duits en Frans) zijn al toewijzingen aanwezig, deze zijn aangepast vanuit de indelingen in VKeybd.

    VMPK kan programma- en controllerchanges naar een MIDI-synthesizer sturen. De definities voor verschillende standaarden en apparaten kunnen worden aangeboden als .INS-bestanden, het formaat dat ook wordt gebruikt door QTractor en TSE3. Het is ontwikkeld door Cakewalk en wordt ook gebruikt in Sonar.

    Deze software bevindt zich in een vroeg alfastadium. Zie het TODO-bestand voor een lijst van mogelijkheden die nog zullen worden toegevoegd. Aarzel niet om contact op te nemen met de auteur als u vragen hebt, een bug wilt rapporteren, of nieuwe mogelijkheden wilt aandragen. U kunt het trackingsysteem op de SourceForge projectwebsite gebruiken.

    Copyright (C) 2008-2011, Pedro Lopez-Cabanillas <plcl AT users.sourceforge.net>

    Virtual MIDI Piano Keyboard is vrije software gelicenseerd onder de voorwaarden van de GPL v3-licentie.
    Een onofficiële vertaling van de GPL v3-licentie is op deze website te vinden.

    Hoe te beginnen

    MIDI-concepten

    MIDI is een industriestandaard om muziekinstrumenten met elkaar te verbinden. De werking berust op het versturen van de gebeurtenissen op het ene instrument naar een ander instrument, waarbij het eerste wordt bespeeld door een muzikant. Gewoonlijk hebben muziekinstrumenten met een MIDI-interface twee DIN-poorten genaamd 'MIDI IN' en 'MIDI OUT'. Soms is er een derde poort met de naam 'MIDI THRU'. Om een MIDI-instrument met een ander te verbinden, moet een MIDI-kabel verbonden zijn met de MIDI OUT van het verzendende instrument en met de MIDI IN van het ontvangende instrument. Meer informatie en tutorials zoals deze zijn overal op het Internet te vinden.

    Voor computers bestaan ook hardware-MIDI-interfaces met MIDI IN- en MIDI OUT-poorten, waardoor de computer met behulp van MIDI-kabels kan communiceren met externe MIDI-instrumenten. Echter, ook zonder hardware-interfaces nodig te hebben kan de computer MIDI-software gebruiken. Neem VMPK als voorbeeld: het stelt MIDI IN- en MIDI OUT-poorten ter beschikking waarmee het met behulp van virtuele MIDI-kabels kan worden verbonden met andere programma's of met fysieke MIDI-interfacepoorten. Verdere details hierover volgen nog.
    Gewoonlijk wordt de MIDI-output van VMPK verbonden met de input van een synthesizer die geluid genereert op basis van MIDI. Een ander veelgebruikt eindpunt van de verbinding is een MIDI-monitor die MIDI-events omzet in leesbare tekst. Dit is handig om te zien wat voor informatie er wordt verzonden via het protocol. In Linux is KMidimon het proberen waard en in Windows MIDIOX.

    VMPK produceert geen geluid, om de gespeelde noten te kunnen horen is er een MIDI-synthesizer nodig. Ik raad aan om QSynth te proberen, een grafisch front-end voor Fluidsynth. Het is ook mogelijk om de "Microsoft GS Wavetable SW Synth" te gebruiken die in Windows XP is ingebouwd. Een externe MIDI hardwaresynthesizer is natuurlijk een nog betere aanpak.

    Toetsenbordtoewijzingen en instrumentdefinities

    VMPK kan helpen om van instrument te veranderen in een MIDI-synthesizer, maar heeft daar wel een definitie van de synthesizergeluiden voor nodig. De definities zijn tekstbestanden met de .INS-extensie, en gebruiken hetzelfde formaat dat wordt gebruikt door Qtractor (Linux) en Sonar (Windows).

    Wanneer u VMPK voor het eerst gebruikt, opent u dan de dialoog Voorkeuren, laad een definitiebestand en kies dan een van de instrumentnamen die vanuit het definitiebestand zijn geladen. Er is een bestand met de naam "gmgsxg.ins" geïnstalleerd in de data-directory van VMPK (gewoonlijk "/usr/share/vmpk" in Linux en "C:\Program Files\VMPK" in Windows). Dit bestand bevat definities voor de General MIDI-, Roland GS- en Yamaha XG-standaarden. Het is een eenvoudig formaat, u kunt een willekeurige teksteditor gebruiken om het te bekijken, aan te passen, of een nieuw bestand te maken. Een bibliotheek van instrumentdefinities is te vinden op de Cakewalk FTP-server.

    Sinds de 0.2.5-release is het mogelijk om SoundFontbestanden (in .SF2- of DLS-formaat) te importeren als instrumentdefinities, door middel van het menu Bestand->Importeer SoundFont.

    Andere instellingen die u mogelijk wilt aanpassen zijn de toetsenbordtoewijzingen. De standaardlayouts wijzen ongeveer tweeënhalf octaaf toe aan het QWERTY-alfanumerieke toetsenbord; er zijn meer definities in de data-directory aanwezig die zijn aangepast voor andere internationale layouts. Daarnaast kunt u uw eigen toewijzingen definiëren met behulp van de dialoog in het menu Bewerken->Toetsenbordtoewijzingen. Ook bestaat de mogelijkheid om de toewijzingen te laden uit en op te slaan als XML-bestanden.
    De laatst geladen toewijzing wordt onthouden voor de volgende keer dat het programma wordt gestart. Sterker nog, al uw voorkeuren, geselecteerde MIDI-bank en -programma en controllerwaarden worden opgeslagen tijdens het afsluiten van het programma, en hersteld wanneer VMPK de volgende keer weer wordt gestart.

    MIDI-verbindingen en virtuele MIDI-kabels

    Om hardware-MIDI-apparaten te verbinden zijn fysieke MIDI-kabels nodig. Zo zijn er ook virtuele kabels nodig om MIDI-software te verbinden. In Windows kunt u gebruik maken van een aantal verschillende programma's voor virtuele MIDI-kabels, zoals: MIDI Yoke, Maple, LoopBe1 of Sony Virtual MIDI Router.

    De MIDI Yoke-setup installeert een driver en voegt een item toe aan het configuratiescherm waarmee het aantal beschikbare MIDI-poorten kan worden ingesteld (na het aanpassen van deze instelling moet de computer opnieuw worden gestart). MIDI Yoke stuurt ieder MIDI-event dat naar een OUT-poort wordt geschreven door naar de corresponderende IN-poort. VMPK kan bijvoorbeeld zijn uitgang verbinden met poort 1, waarna een ander programma zoals QSynth de verzonden events kan uitlezen op die poort.

    Door middel van MIDIOX kunnen er meer routes worden toegevoegd tussen MIDI Yoke- en systeem-MIDI-poorten. Dit programma beschikt ook over andere interessante functionaliteit, zoals het afspelen van MIDI-bestanden. U kunt luisteren naar de muziek die wordt afgespeeld door een MIDI-synthesizer en tegelijkertijd in VMPK de afgespeelde noten zien (slechts één kanaal tegelijkertijd). U kunt dit doen door in het "Routes"-venster van MIDIOX een verbinding te maken tussen ingangspoort 1 en de Windows-synthesizerpoort. Configureer daarnaast de MIDI-poort van het afspeelprogramma om zijn MIDI-data naar poort 1 te sturen en stel tenslotte de ingangspoort van VMPK in om te lezen vanaf MIDI Yoke-poort 1. Het afspeelprogramma zal nu zijn events naar uitgangspoort 1 sturen, waar ze zowel naar de ingangspoort 1 als naar de synthesizerpoort verstuurd zullen worden.

    In Linux is er de ALSA-sequencer om voor virtuele kabels te zorgen. De poorten worden dynamisch gecreërd wanneer u een programma start, er is dus geen vast aantal zoals in MIDI Yoke. Met het command-line-programma "aconnect" kunt u verbindingen tussen poorten maken en verbreken, of het nu applicaties of hardware interfaces zijn. Een handige GUI-applicatie om datzelfde te doen is QJackCtl. Het hoofddoel van dit programma is het aansturen van de Jack-daemon (starten, stoppen en inspecteren van de huidige staat). Jack stelt virtuele audiokabels beschikbaar om poorten van de geluidskaart met audiosoftware te verbinden, dus net zoals de virtuele MIDI-kabels, maar in plaats daarvan voor digitale audio.

    Veelgestelde vragen

    Hoe kan ik 88 toetsen weergeven?

    Het getal 88 is een willekeurig gekozen aantal dat door de meeste moderne pianofabrikanten wordt gebruikt, maar orgel- en synthesizerfabrikanten volgen deze conventie niet altijd.
    VMPK kan worden geconfigureerd om tussen de een en tien octaven weer te geven. Met zeven octaven worden 84 toetsen weergegeven en met acht octaven zijn dat er 98. Het is niet mogelijk om precies zeven en een kwart octaven weer te geven.

    Er is geen geluid hoorbaar

    VMPK produceert zelf geen geluid. U hebt een MIDI-synthesizer nodig, zoals duidelijk in de documentatie vermeld.

    Sommige toetsen geven geen geluid

    Wanneer u op een standaard MIDI-synthesizer kanaal 10 selecteert, zijn percussiegeluiden gekoppeld aan een groot deel van de toetsen, maar niet aan alle. Op melodische kanalen (alle behalve 10) kunt u een patch geselecteerd hebben met een beperkt notenbereik. In de muziek is dit bekend onder de naam omvang of tessituur.

    De optie om het toetsenbord over te nemen werkt niet

    Dit is een bekend probleem voor Linuxgebruikers. Deze optie werkt goed op KDE3/4-desktops die de standaard KWin-window manager gebruiken. Het werkt ook met Enlightenment en Window Maker, maar niet met de Metacity- en Compiz-window managers, die vaak worden gebruikt in combinatie met Gnome. Verder is het bekend dat het gebruik van deze optie normaal gebruik van dropdown-menu's in GTK2 onmogelijk maakt. Er is geen oplossing bekend voor dit probleem, behalve het ontwijken van de probleemscenario's tijdens het gebruik van de optie.

    Patchnamen komen niet overeen met de daadwerkelijke geluiden

    U hebt een .INS-bestand nodig dat precies overeenkomt met de geluiden danwel het SoundFont van uw synthesizer. Het meegeleverde bestand (gmgsxg.ins) bevat alleen definities voor standaard GM-, GS- en XG-instrumenten. Als uw MIDI-synthesizer niet geheel overeenkomt met één van die standaarden hebt u een ander .INS-bestand nodig, of moet u er zelf een maken.

    Syntaxis van de instrumentdefinitiebestanden (.INS)

    Eén mogelijke uitleg van het INS-formaat is hier te vinden.

    Kan ik mijn instrumentdefinitie voor vkeybd naar een .INS-bestand converteren?

    Natuurlijk, gebruik het AWK-script "txt2ins.awk". U kunt ook het hulpprogramma 'sftovkb' van vkeybd gebruiken om een .INS.bestand te genereren op basis van een SF2-SoundFont. Overigens heeft VMPK ook een functie om instrumentnamen te importeren vanuit SF2- en DLS-bestanden.

    $ sftovkb SF2NAME.sf2 | sort -n -k1,1 -k2,2 > SF2NAME.txt
    $ awk -f txt2ins.awk SF2NAME.txt > SF2NAME.ins
    

    Het AWK-script "txt2ins.awk" is te vinden in de data-directory van VMPK.

    Downloaden

    De nieuwste source code, Windows- en Max OSX-packages kunt u vinden op de SourceForge projectwebsite.

    Ook zijn direct installeerbare packages beschikbaar voor de volgende Linuxdistributies:

    Installatie vanuit de sourcecode

    Download the sourcecode van http://sourceforge.net/projects/vmpk/files. Pak het bestand uit in uw home-directory en ga naar de directory die nu is aangemaakt.

    $ cd vmpk-x.y.z
    

    Om het systeem te bouwen hebt u de keus tussen CMake en QMake; die laatste is alleen bedoeld voor test- en ontwikkeldoeleinden.

    $ cmake .
    of
    $ ccmake .
    of
    $ qmake
    

    Compileer daarna het programma:

    $ make
    

    Als het programma succesvol is gecompileerd, kunt u het installeren:

    $ sudo make install
    

    Benodigdheden

    Om VMPK succesvol te kunnen bouwen en gebruiken, hebt u Qt 4.6 of nieuwer nodig. (Installeer het '-devel'-package voor uw systeem, of download de opensource-editie van qtsoftware.com, voorheen Trolltech.)

    RtMIDI is in de sourcecode opgenomen. Het gebruikt de ALSA-sequencer in Linux, WinMM in windows en CoreMIDI in Mac OSX; deze subsystemen zijn ingebouwde onderdelen van hun respectievelijke platforms.

    Het buildsysteem is gebaseerd op CMake.

    U hebt ook de GCC C++ compiler nodig. MinGW is daarvan een Windows-port.

    Optioneel kunt u een Windowssetup bouwen met behulp van NSIS.

    Opmerkingen voor windowsgebruikers

    Om in Windows de sourcecode te kunnen compileren hebt u het .bz2- of het .gz-archief nodig, om dat uit te pakken hebt u een programma nodig dat het formaat ondersteunt, zoals 7-Zip.

    Om de sourcecode te configureren hebt u QMake (onderdeel van Qt4) of CMake nodig. De PATH-variabele moet worden ingesteld om de directories te bevatten voor zowel de Qt4-binaries, de MinGW-binaries en de CMake-binaries.

    Opmerkingen voor Mac OSX-gebruikers

    Een vooraf gecompileerde applicatiebundel, die ook de Qt4-runtimebibliotheken bevat, is te vinden bij de projectdownloads. Geeft u er de voorkeur aan te installeren vanuit de sourcecode, dan kunt u CMake of Qmake gebruiken om een applicatiebundel te bouwen die gebruik maakt van de geïnstalleerde systeembibliotheken.

    Het buildsysteem is geconfigureerd om een zogenaamde universal binary (x86+ppc) te creëren voor de applicatiebundel. U hebt de ontwikkeltools en frameworks van Apple nodig, en daarnaast ook de Qt4-SDK van Nokia.

    Om VMPK te compileren door middel van Makefiles gegenereerd door Qmake:

    $ qmake vmpk.pro -spec macx-g++
    $ make
    en optioneel:
    $ macdeployqt build/vmpk.app
    

    Om VMPK te compileren door middel van Makefiles gegenereerd door CMake:

    $ cmake -G "Unix Makefiles" .
    $ make
    

    Om projectbestanden voor Xcode te creëren:

    $ qmake vmpk.pro -spec macx-xcode
    of
    $ cmake -G Xcode .
    

    Hebt u iets nodig om geluid te produceren, kijkt u dan eens naar SimpleSynth, of FluidSynth (beschikbaar in Fink). Voor routing van MIDI bestaat er MIDI Patchbay.

    Opmerkingen voor geavanceerde gebruikers en samenstellers van packages

    U kunt de compiler vragen optimalisatie toe te passen tijdens het compileren van het programma. Er zijn twee mogelijkheden om dit te doen. Ten eerste:

    $ cmake . -DCMAKE_BUILD_TYPE=Release
    

    Het CMake "Release"-type gebruikt de compilervlaggen: "-O3 -DNDEBUG". Andere voorgedefinieerde buildtypes zijn "Debug", "RelWithDebInfo" en "MinSizeRel".
    De tweede mogelijkheid om te optimaliseren is zelf compilervlaggen te kiezen:

    $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG"
    $ cmake .
    

    Mochten deze vlaggen niet werken, kiest u dan zelf de goede CXXFLAGS-opties.

    Wilt u het programma niet op de standaardlocatie (/usr/local) installeren, gebruik dan de volgende CMake-optie:

    $ cmake . -DCMAKE_INSTALL_PREFIX=/usr
    

    Dankwoord

    Behalve de eerder genoemde software gebruikt VMPK werk van de volgende opensource-projecten:

    • van Qtractor, door Rui Nuno Capela
      Classes voor instrumentdefinitiedata
    • van QSynth, door Rui Nuno Capela
      Draaiknop-widget
    • Pictogram en logo door Theresa Knott

    Heel erg bedankt!

    vmpk-0.4.0/data/vmpk.svgz0000644000175000001440000002523311572642326014336 0ustar pedrousersَוѬ yEEhŮ)iK։1L\U2`>{XkG?ozÛwo?dsWo޾~wŋ^{{wOvy7oŏgq㳧O~}ᯯlܷ/ϟ\sS~{ryzy8|_}/Oo^]|I ߟy߼zDOJO}][IO8{ۋu:/9pFW}xtD'W?\r~~ٽ|w|ݏ/^YvɻpЪ>a{5Y?,^>ۧ7?3e>!qREJڒ:@Kh~ϟeyP~Ȯtt}_t49\;zLxen&9Ͼ'tt{}8o.D?8sֿw/.޿acJm۷Vsrї>PGw ߐ>(rמENilѓrJZmrmÐƾ:oKL巡N& 2c,& tSJSx!r sOJ=DJ&n7ʾ&rCRiP IZ۷$'u?]z5~RT!r %[/]ߏ7wtv;}^CC FY>Muz~ŬEږ*V/>Lr&S7} cUmR˜TIQ=D~am up^y}crOAnI-f' /oRV8LrK[P> L)2$"RJ7Ԣk3:W;9Qגb~RUk$%l $#q7wBBMܐ{і%O{ _TSc6A^n KS7R&BJ~覠|RP ΚqwZF} սjl7i4{KN9lU$VM닋э:Z9=Lᾚ'5 {R<WTyP( Uj:&Oz/oC^MSfPglmJxұM93M1 @_߳a"[D)ʇ\!"Ro?˃\Y81VT^oҦ?^7x0;dل\KOcBnVǺVYۨΖ]_i^//ϛ~akD!6$Fan^Vd#2_uC^2oIGcr>,ԽKpZ1y'ltn]$1勪}// u#Xc+kDA>J(41 ,iPGI.^"Qt4py[XOStpY꾆Fѵ Y| 9%aEc w=D.=o[%8y}1Lk-GHjGIY/7$̸%.ݧm0zdfފ!nr6Z}\ϛ:6UөC ;iIrwmX3֡%dlN-^=ܷuFze=WDXX8&9vEPj:/ci6B(1M}qNv$ kAG3z_ك"]gh{WBJҭ& `{W12 Vw..n֬б'-f&U5pd֊gH~& SZҺ^FXː}$ 'o#5w^(*Zռ=eR֐SZ*%j:CkUr+nH,T {\7(v7ubQ>NzCB|R[>y\=gw59xew_ D:J{UzY-}擛"T>^;d;{ʦ5b(EA*._[e2d9p!u.)mZ tXԻ.r:Zt8S)N +[u@/qT~T&3ń&-9~T$!VeKw( M|^vFᬣ/-5M^L@iuI(01k ʰ'N\*ƒ hq F)T] P%n*.8YC7}rUp_}gg={ի?|xήuם[t%>zg/׏wo>ѫ2>B?]n*4:A}ԾҗPϪ. T_^bO“),˷ 6Xj0ֵ"y.|Hr1#mpMJ!v3.+3uGl%rAV"jQVxȈ`}O, y-KGkNP.m"VXd,;ϮQT\k))SW RY^ḏCy|iKV󔈪*xIJP%X.G028MX\F)$Q,ћ=@(:?iGR^I"M O,ψ9rJFk'?u\=%$nO,%E`ghSHHݫN"Z]Y,>V^bq#v9.;[Eyoq}+5GeS%,A¹pe\s0拣]wo^>J_>+G~}E.ͰXzrgT9@;%*~sS^ʣnjTGfm5| 6Z7ͮRHU$WbiQ,g!y:@j]Y굛MA=qQ]u<_ !F|rǭ %:Hb(.|FxϚ@c;88Mzvi5$陳2d1.Y q I)KX; N6G rp-QE}{ƒ}ZK% zSŋyC!9ʴbԱ*1sɧjC\)FK~V(4s5PP3UNJczU:]=s5|)H>^CZn+WIVI_x!V݀ðaG"sPj22$}rpN"T^<4ihvMYRd2:R&w CkHa$AsHKoRI:]bH@+%O7it X5F3GْTVi )$(pS~k04gXUA2,zu]٭r+Yunq;k Pz맛DH}5Jelǒ<[4 F0r=u8X>V6 c&UJaGF/'|ZKr- |W@jcɵ:.5ּ\@'2↔Odo"''͟6dXtaR$Y|'9c?{)yU* ).\>6/.ttp)ʩ;[%`z^%,. )  q΍1UB/bqT^#a*v]Ku"2&aTUi]Þjxbh~1Ɉ3$帩@ܖ+zw^_ߗu%,ܫܰi&=+8ph"֐QذQra~ /;[^U$nkTx"DsAH%ڠ7Dt&]c/H AV@3^Fn{X8M,!G/9^@Õj ՉC 鴮p!eT|gYIyDeZH;tJBˇw/q=[M$Y޹V 7Q'yKˠud S4j5lBB %ыyg/(q XG'G`UdAF=&fkiM\dlFiM%&5C_JƤkYxZl#v0I+ 7*g\I :]ݐg %PihO+ .:}|Dl e*F/?o+,`g.*(B?J+kn((GmX#wPP`p,B{8$eh 0L D~J:F/n˰uƧzэXhxfv 'pHp?He˲aM2Pet$mݕcu C15w]V_$jd,'$<ȝV$J%Gy{#)PSWLRL*i4wl;32YVTZO) vEHфeaH&(]H@TXhCOQyb;û8+õY(b~NhoӁF0Ԇ[h+ƢD s+:EZJ]%PԷnЧ耄Xf8c33׳Ҥp{HX'iA2vc22ĹAbt}Z[,Y N!1@C5i5qӓ·ץŒ Yئ\-M%st (7Wm6`Fj$˻ e鱱QPar= c:f5qn'|bAnaZ#И24&FUd I GZb.%dD""{ ކȬJAÃtz>b@ydF%i ʼnN0?IWD^ b2a4S ̝I,mJdt@^u2'aQ\o_x\;Dger)r&s)-T~ckZ l%aXÂ1 QH8 JyہgK#Op]SX|I`@Yz_c{cd4dz]w14CKK {g~NF鿚I- 0El*g~l+@wgbgc}Dv ҲktP ~beҀ,eI|VHd1 زLjh('%k~(xz1mBt xXQgKx,}Jld.o^'Uq!"V(^QVAXk;E)=v"0Wy\}5H2v9Џv!sp䏩W"62\5q1NaSFΘE)Z(|ַ'mvA%"yw8o c PhU8fѓ zgGBq1gvlN2 M{!z7 "wZ%srYU!Bmvw jJ I1,JLzRtcs,_@0B]2c17 хpZHk&WCMn=ǹ P]Nғt\ӭ WtӀÉ)ORDՆXMk.9'RYԱ|-IMn4_$,dC>3VRiJ@9O63܅rdZk^FՓϻSMilucN*-Gf081!" Ź)SJ( < 0E(dAVm\8}ƹ][V'طXuXdBD*2}IfC0״- ttztI\̐/-QYE:/PVHπ,[0F<Њ4ML0"*TB/ ah20yd$ǣ9Q^uXA4ax44]c ِSq9wۚX˔t@ *UhgeekU[}{u&gԐ;R5#r9dOTqG]{uV}f[J+^P4ߓ1dDU*D Yȁ`D€|W("JC- r*#Bl.\qeJ<ζuݥhm.[u%GSDf%͚3pud\~79*{ }q$eZx:W h"qj:lA*I4494rH0ѧ :57SH&bǪ Ɯ_W"-X?:{փ!1(PWSB]EfL5^]:X겏#^Ã0pʉ N+fb=VuS m lx"ء:NjNlT#{&11432WjVQ4/0A@ p3:pe--ZKN'tufPRNrh5Dd@Lt6صsG\ΊrRX)O>|FĎ?7 ٙDQ,^Hɪ5Hf%YSWAd=cj0d( ZV6.ct1 \zrcm?yv\:`%Urj,;iTG\#][/PO4aFPeGo3`"]U(aK#\%^>oN:QsPh+DĶf@zH溒{,ғ񗳋)dPEkl0pRU OC.Ⱥ|HcA wUBӂ1hJ ZJP p*ZY0:6þ gיqqf8sjHPupH#eߋ7eH3@ULŸu}va#o4g.{*>2&Obrd?@#v!Q\n_!cΊ%cD!35R(^~%98U77j(RpApF{͋Wb_*\ 9I\J3nȐ0';%ӷ,rhL$g^3nT՞FWk[+je475B{ ǁeՑ|{pҟ\f (,s[(kW;@*y!,S*"6om'FG 9U~Yv$be?!82{]\[R! Ǹ{"=Nyvk-GM04w֫%kk$ћ t,Ml]f|?ƌ$Q#n8n'[-A#Ia}:lJ㸳d'X01uɌb必ø~Ἱ5R>eep#yޔ{AlۼvIU l ]  r+:\S*[l(@hd"Q x:ZHcZ'b` uH{Nn&*<2.~.XI|zZy[pC2WuCz [;mi+wo܀986k\*vga띇%-o+4zP=l eBc'-|b r.䆘^@E EOF^DofNp#mQsޭvhDs]yiOW;Hdi6"љΟ]zn5ȫS |IeS4nv) 9&O9[F7goY)qB~d;ϧ7VOZym؍S=#%Pj+uteYVf uz.eoa,M7Ut[!UlW ^k@(ْR٘Kknb`_{{liߤ73V@(GL8q:[vv5F@Ep̏F*Zо]aݰ҂ԲhhԽ,1\ܸBmN{g9L{N6$H[_[c5{-1Ce:N:'WFsCxI6o,W]d&UVe5ȿDR! I;'LQ(G-d[*\[8\4Cc[I d5/@2D'TZ9P0ߝDN?SC[o~% vmpk-0.4.0/data/gmgsxg.ins0000644000175000001440000021370411572642326014457 0ustar pedrousers; ---------------------------------------------------------------------- .Patch Names [General MIDI] 0=Acoustic Grand Piano 1=Bright Acoustic Piano 2=Electric Grand Piano 3=Honky-tonk Piano 4=Rhodes Piano 5=Chorused Piano 6=Harpsichord 7=Clavinet 8=Celesta 9=Glockenspiel 10=Music Box 11=Vibraphone 12=Marimba 13=Xylophone 14=Tubular Bells 15=Dulcimer 16=Hammond Organ 17=Percussive Organ 18=Rock Organ 19=Church Organ 20=Reed Organ 21=Accordion 22=Harmonica 23=Tango Accordion 24=Acoustic Guitar (nylon) 25=Acoustic Guitar (steel) 26=Electric Guitar (jazz) 27=Electric Guitar (clean) 28=Electric Guitar (muted) 29=Overdriven Guitar 30=Distortion Guitar 31=Guitar Harmonics 32=Acoustic Bass 33=Electric Bass (finger) 34=Electric Bass (pick) 35=Fretless Bass 36=Slap Bass 1 37=Slap Bass 2 38=Synth Bass 1 39=Synth Bass 2 40=Violin 41=Viola 42=Cello 43=Contrabass 44=Tremolo Strings 45=Pizzicato Strings 46=Orchestral Harp 47=Timpani 48=String Ensemble 1 49=String Ensemble 2 50=SynthStrings 1 51=SynthStrings 2 52=Choir Aahs 53=Voice Oohs 54=Synth Voice 55=Orchestra Hit 56=Trumpet 57=Trombone 58=Tuba 59=Muted Trumpet 60=French Horn 61=Brass Section 62=Synth Brass 1 63=Synth Brass 2 64=Soprano Sax 65=Alto Sax 66=Tenor Sax 67=Baritone Sax 68=Oboe 69=English Horn 70=Bassoon 71=Clarinet 72=Piccolo 73=Flute 74=Recorder 75=Pan Flute 76=Bottle Blow 77=Shakuhachi 78=Whistle 79=Ocarina 80=Lead 1 (square) 81=Lead 2 (sawtooth) 82=Lead 3 (calliope lead) 83=Lead 4 (chiff lead) 84=Lead 5 (charang) 85=Lead 6 (voice) 86=Lead 7 (fifths) 87=Lead 8 (bass + lead) 88=Pad 1 (new age) 89=Pad 2 (warm) 90=Pad 3 (polysynth) 91=Pad 4 (choir) 92=Pad 5 (bowed) 93=Pad 6 (metallic) 94=Pad 7 (halo) 95=Pad 8 (sweep) 96=FX 1 (rain) 97=FX 2 (soundtrack) 98=FX 3 (crystal) 99=FX 4 (atmosphere) 100=FX 5 (brightness) 101=FX 6 (goblins) 102=FX 7 (echoes) 103=FX 8 (sci-fi) 104=Sitar 105=Banjo 106=Shamisen 107=Koto 108=Kalimba 109=Bagpipe 110=Fiddle 111=Shanai 112=Tinkle Bell 113=Agogo 114=Steel Drums 115=Woodblock 116=Taiko Drum 117=Melodic Tom 118=Synth Drum 119=Reverse Cymbal 120=Guitar Fret Noise 121=Breath Noise 122=Seashore 123=Bird Tweet 124=Telephone Ring 125=Helicopter 126=Applause 127=Gunshot [GM Drumsets] 0=Percussion 1 1=Percussion 2 2=Percussion 3 3=Percussion 4 4=Percussion 5 5=Percussion 6 6=Percussion 7 7=Percussion 8 8=Percussion 9 9=Percussion 10 10=Percussion 11 11=Percussion 12 12=Percussion 13 13=Percussion 14 14=Percussion 15 15=Percussion 16 16=Percussion 17 17=Percussion 18 18=Percussion 19 19=Percussion 20 20=Percussion 21 21=Percussion 22 22=Percussion 23 23=Percussion 24 24=Percussion 25 25=Percussion 26 26=Percussion 27 27=Percussion 28 28=Percussion 29 29=Percussion 30 30=Percussion 31 31=Percussion 32 32=Percussion 33 33=Percussion 34 34=Percussion 35 35=Percussion 36 36=Percussion 37 37=Percussion 38 38=Percussion 39 39=Percussion 40 40=Percussion 41 41=Percussion 42 42=Percussion 43 43=Percussion 44 44=Percussion 45 45=Percussion 46 46=Percussion 47 47=Percussion 48 48=Percussion 49 49=Percussion 50 50=Percussion 51 51=Percussion 52 52=Percussion 53 53=Percussion 54 54=Percussion 55 55=Percussion 56 56=Percussion 57 57=Percussion 58 58=Percussion 59 59=Percussion 60 60=Percussion 61 61=Percussion 62 62=Percussion 63 63=Percussion 64 64=Percussion 65 65=Percussion 66 66=Percussion 67 67=Percussion 68 68=Percussion 69 69=Percussion 70 70=Percussion 71 71=Percussion 72 72=Percussion 73 73=Percussion 74 74=Percussion 75 75=Percussion 76 76=Percussion 77 77=Percussion 78 78=Percussion 79 79=Percussion 80 80=Percussion 81 81=Percussion 82 82=Percussion 83 83=Percussion 84 84=Percussion 85 85=Percussion 86 86=Percussion 87 87=Percussion 88 88=Percussion 89 89=Percussion 90 90=Percussion 91 91=Percussion 92 92=Percussion 93 93=Percussion 94 94=Percussion 95 95=Percussion 96 96=Percussion 97 97=Percussion 98 98=Percussion 99 99=Percussion 100 100=Percussion 101 101=Percussion 102 102=Percussion 103 103=Percussion 104 104=Percussion 105 105=Percussion 106 106=Percussion 107 107=Percussion 108 108=Percussion 109 109=Percussion 110 110=Percussion 111 111=Percussion 112 112=Percussion 113 113=Percussion 114 114=Percussion 115 115=Percussion 116 116=Percussion 117 117=Percussion 118 118=Percussion 119 119=Percussion 120 120=Percussion 121 121=Percussion 122 122=Percussion 123 123=Percussion 124 124=Percussion 125 125=Percussion 126 126=Percussion 127 127=Percussion 128 [Roland GS Capital Tones] 0=Piano 1 1=Piano 2 2=Piano 3 3=Honky-tonk 4=E.Piano 1 5=E.Piano 2 6=Harpsichord 7=Clav. 8=Celesta 9=Glockenspiel 10=Music Box 11=Vibraphone 12=Marimba 13=Xylophone 14=Tubular-bell 15=Santur 16=Organ 1 17=Organ 2 18=Organ 3 19=Church Org.1 20=Reed Organ 21=Accordion Fr 22=Harmonica 23=Bandneon 24=Nylon-str.Gt 25=Steel-str.Gt 26=Jazz Gt. 27=Clean Gt. 28=Muted Gt. 29=Overdrive Gt 30=DistortionGt 31=Gt.Harmonics 32=Acoustic Bs. 33=Fingered Bs. 34=Picked Bass 35=Fretless Bs. 36=Slap Bass 1 37=Slap Bass 2 38=Synth Bass 1 39=Synth Bass 2 40=Violin 41=Viola 42=Cello 43=Contrabass 44=Tremolo Str 45=PizzicatoStr 46=Harp 47=Timpani 48=Strings 49=Slow Strings 50=Syn.Strings1 51=Syn.Strings2 52=Choir Aahs 53=Voice Oohs 54=SynVox 55=OrchestraHit 56=Trumpet 57=Trombone 58=Tuba 59=MutedTrumpet 60=French Horn 61=Brass 1 62=Synth Brass 1 63=Synth Brass 2 64=Soprano Sax 65=Alto Sax 66=Tenor Sax 67=Baritone Sax 68=Oboe 69=English Horn 70=Bassoon 71=Clarinet 72=Piccolo 73=Flute 74=Recorder 75=Pan Flute 76=Bottle Blow 77=Shakuhachi 78=Whistle 79=Ocarina 80=Square Wave 81=Saw Wave 82=Syn.Calliope 83=Chiffer Lead 84=Charang 85=Solo Vox 86=5th Saw Wave 87=Bass & Lead 88=Fantasia 89=Warm Pad 90=Polysynth 91=Space Voice 92=Bowed Glass 93=Metal Pad 94=Halo Pad 95=Sweep Pad 96=Ice Rain 97=Soundtrack 98=Crystal 99=Atmosphere 100=Brightness 101=Goblin 102=Echo Drops 103=Star Theme 104=Sitar 105=Banjo 106=Shamisen 107=Koto 108=Kalimba 109=Bag Pipe 110=Fiddle 111=Shanai 112=Tinkle Bell 113=Agogo 114=Steel Drums 115=Woodblock 116=Taiko 117=Melo. Tom 1 118=Synth Drum 119=Reverse Cym. 120=Gt.FretNoise 121=Breath Noise 122=Seashore 123=Bird 124=Telephone 1 125=Helicopter 126=Applause 127=Gun Shot [Roland GS Drumsets] 0=Standard 8=Room 16=Power 24=Electronic 25=TR-808 32=Jazz 40=Brush 48=Orchestra 56=SFX [Roland GS Var #01] 38=Synth Bass101 57=Trombone 2 60=French Horn2 80=Square 81=Saw 98=Syn Mallet 102=Echo Bell 104=Sitar 2 120=Gt.Cut Noise 121=Fl.Key Click 122=Rain 123=Dog 124=Telephone 2 125=Car-Engine 126=Laughing 127=Machine Gun [Roland GS Var #02] 102=Echo Pan 120=String Slap 122=Thunder 123=Horse-Gallop 124=DoorCreaking 125=Car-Stop 126=Screaming 127=Lasergun [Roland GS Var #03] 122=Wind 123=Bird 2 124=Door 125=Car-Pass 126=Punch 127=Explosion [Roland GS Var #04] 122=Stream 124=Scratch 125=Car-Crash 126=Heart Beat [Roland GS Var #05] 122=Bubble 124=Windchime 125=Siren 126=Footsteps [Roland GS Var #06] 125=Train [Roland GS Var #07] 125=Jetplane [Roland GS Var #08] 0=Piano 1w 1=Piano 2w 2=Piano 3w 3=Honky-tonk w 4=Detuned EP 1 5=Detuned EP 2 6=Coupled Hps. 11=Vib.w 12=Marimba w 14=Church Bell 16=Detuned Or.1 17=Detuned Or.2 19=Church Org.2 21=Accordion It 24=Ukulele 25=12-str.Gt 26=Hawaiian Gt. 27=Chorus Gt. 28=Funk Gt. 30=Feedback Gt. 31=Gt.Feedback 38=Synth Bass 3 39=Synth Bass 4 40=Slow Violine 48=Orchestra 50=Syn.Strings3 61=Brass 2 62=Synth Brass3 63=Synth Brass4 80=Sine Wave 81=Doctor Solo 107=Taisho Koto 115=Castanets 116=Concert BD 117=Melo. Tom 2 118=808 Tom 125=Starship [Roland GS Var #09] 14=Carillon 118=Elec Perc 125=Burst Noise [Roland GS Var #16] 0=Piano 1d 4=E.Piano 1w 5=E.Piano 2w 6=Harpsi.w 16=60's Organ 1 19=Church Org.3 24=Nylon Gt.o 25=Mandolin 28=Funk Gt.2 39=Rubber Bass 62=AnalogBrass1 63=AnalogBrass2 [Roland GS Var #24] 4=60's E.Piano 6=Harpsi.o [Roland GS Var #32] 16=Organ 4 17=Organ 5 24=Nylon Gt.2 52=Choir Aahs 2 [XG Bank 0] 0=01 GrandPno 1=02 BritePno 2=03 E.Grand 3=04 HnkyTonk 4=05 E.Piano1 5=06 E.Piano2 6=07 Harpsi. 7=08 Clavi. 8=09 Celesta 9=10 Glocken 10=11 MusicBox 11=12 Vibes 12=13 Marimba 13=14 Xylophon 14=15 TubulBel 15=16 Dulcimer 16=17 DrawOrgn 17=18 PercOrgn 18=19 RockOrgn 19=20 ChrchOrgn 20=21 ReedOrgn 21=22 Acordion 22=23 Harmnica 23=24 TangoAcd 24=25 NylonGtr 25=26 SteelGtr 26=27 Jazz Gtr 27=28 CleanGtr 28=29 Mute.Gtr 29=30 Ovrdrive 30=31 Dist.Gtr 31=32 GtrHarmo 32=33 Aco.Bass 33=34 FngrBass 34=35 PickBass 35=36 Fretless 36=37 SlapBas1 37=38 SlapBas2 38=39 SynBass1 39=40 SynBass2 40=41 Violin 41=42 Viola 42=43 Cello 43=44 Contrabs 44=45 Trem.Str 45=46 Pizz.Str 46=47 Harp 47=48 Timpani 48=49 Strings1 49=50 Strings2 50=51 Syn.Str1 51=52 Syn.Str2 52=53 ChiorAah 53=54 VoiceOoh 54=55 SynVoice 55=56 Orch.Hit 56=57 Trumpet 57=58 Trombone 58=59 Tuba 59=60 Mute.Trp 60=61 Fr.Horn 61=62 BrasSect 62=63 SynBras1 63=64 SynBras2 64=65 SprnoSax 65=66 Alto Sax 66=67 TenorSax 67=68 Bari.Sax 68=69 Oboe 69=70 Eng.Horn 70=71 Bassoon 71=72 Clarinet 72=73 Piccolo 73=74 Flute 74=75 Recorder 75=76 PanFlute 76=77 Bottle 77=78 Shakhchi 78=79 Whistle 79=80 Ocarina 80=81 SquareLd 81=82 Saw.Lead 82=83 CaliopLd 83=84 Chiff Ld 84=85 CharanLd 85=86 Voice Ld 86=87 Fifth Ld 87=88 Bass &Ld 88=89 NewAgePad 89=90 Warm Pad 90=91 PolySyPd 91=92 ChoirPad 92=93 BowedPad 93=94 MetalPad 94=95 Halo Pad 95=96 SweepPad 96=97 Rain 97=98 SoundTrk 98=99 Crystal 99=100 Atmosphr 100=101 Bright 101=102 Goblins 102=103 Echoes 103=104 Sci-Fi 104=105 Sitar 105=106 Banjo 106=107 Shamisen 107=108 Koto 108=109 Kalimba 109=110 Bagpipe 110=111 Fiddle 111=112 Shanai 112=113 TnklBell 113=114 Agogo 114=115 SteelDrm 115=116 WoodBlok 116=117 TaikoDrm 117=118 MelodTom 118=119 Syn.Drum 119=120 RevCymbl 120=121 FretNoiz 121=122 BrthNoiz 122=123 Seashore 123=124 Tweet 124=125 Telphone 125=126 Helicptr 126=127 Applause 127=128 Gunshot [XG Bank 1 (KSP)] 0=01 GrndPnoK 1=02 BritPnoK 2=03 ElGrPnoK 3=04 HnkyTnkK 4=05 El.Pno1K 5=06 El.Pno2K 6=07 Harpsi.K 7=08 Clavi. K 11=12 VibesK 12=13 MarimbaK [XG Bank 100] 112=113 Rama Cym 119=120 Rev Tom1 [XG Bank 101] 112=113 AsianBel 119=120 Rev Tom2 [XG Bank 12 (Fast Decay)] 30=31 DstRthmG 39=40 Seq Bass 62=63 QuackBr 98=99 SynDrCmp [XG Bank 14 (Double Attack)] 61=62 SfrzndBr 98=99 Popcorn 102=103 Echo Pan [XG Bank 16 (Bright)] 24=25 NylonGt2 25=26 SteelGt2 52=53 Ch.Aahs2 56=57 Trumpet2 58=59 Tuba 2 87=88 Big&Low 89=90 ThickPad [XG Bank 17] 56=57 BriteTrp 89=90 Soft Pad [XG Bank 18 (Dark)] 0=01 MelloGrP 4=05 MelloEP1 26=27 MelloGtr 33=34 FingrDrk 38=39 SynBa1Dk 39=40 ClkSynBa 57=58 Trmbone2 63=64 Soft Brs 80=81 Hollow 81=82 DynaSaw 89=90 SinePad 98=99 TinyBell 99=100 WarmAtms [XG Bank 19] 39=40 SynBa2Dk 80=81 Shmoog 81=82 DigiSaw 99=100 HollwRls [XG Bank 20 (Rsonant)] 38=39 FastResB 62=63 RezSynBr 81=82 Big Lead 95=96 Shwimmer [XG Bank 24 (Attack)] 17=18 70sPcOr1 30=31 DistGtr2 38=39 AcidBass 48=49 ArcoStr 62=63 PolyBrss 81=82 HeavySyn 85=86 SynthAah [XG Bank 25 (Release)] 6=7 Harpsi.2 24=25 NylonGt3 81=82 WaspySyn [XG Bank 27 (Rezo Sweep)] 7=8 ClaviWah 33=34 FlangeBa 36=37 ResoSlap 50=51 ResoStr 62=63 SynBras3 95=96 Converge 97=98 Prologue [XG Bank 28 (Muted)] 34=35 MutePkBa 105=106 MuteBnjo [XG Bank 3 (Stereo)] 48=49 S.Strngs 49=50 S.SlwStr 52=53 S.Choir [XG Bank 32 (Detune 1)] 2=03 Det.CP80 4=05 Chor.EP1 5=06 Chor.EP2 16=17 DetDrwOr 17=18 DetPrcOr 19=20 ChurOrg3 21=22 AccordIt 22=23 Harmo 2 26=27 JazzAmp 27=28 ChorusGt 35=36 Fretles2 36=37 PunchThm 39=40 SmthBa 2 52=53 MelChoir 56=57 WarmTrp 60=61 FrHorn2 62=63 JumpBrss 104=105 DetSitar [XG Bank 33 (Detune 2)] 5=06 DX Hard 16=17 60sDrOr1 17=18 LiteOrg 35=36 Fretles3 [XG Bank 34 (Detune 3)] 5=06 DX Legend 16=17 60sDrOr2 35=36 Fretles4 [XG Bank 35 (Octave 1)] 6=07 Harpsi.3 15=16 Dulcimr2 16=17 70sDrOr1 19=20 ChurOrg2 25=26 12StrGtr 30=31 DistGtr3 38=39 Clv Bass 48=49 60sStrng 50=51 Syn Str 3 55=56 OrchHit2 61=62 Tp&TbSec 86=87 Big Five 98=99 RndGlock 104=105 Sitar 2 [XG Bank 36 (Octave 2)] 16=17 DrawOrg2 30=31 PowerGt2 [XG Bank 37 (5th 1)] 16=17 60sDrOr3 17=18 PercOrg2 30=31 PowerGt1 60=61 HornOrch [XG Bank 38 (5th 2)] 16=17 EvenBar 30=31 Dst.5ths [XG Bank 39 (Bend)] 61=62 BrssFall [XG Bank 40 (Tutti)] 0=01 PianoStr 2=03 GrPno1 4=05 HardEl.P 5=06 DX Phase 16=17 16+2"2/3 19=20 NotreDam 20=21 Puff Org 25=26 Nyln&Stl 28=29 FunkGtr1 30=31 FeedbkGt 32=33 JazzRthm 33=34 Ba&DsEG 38=39 TeknoBa 39=40 ModulrBa 44=45 Susp Str 46=47 YangChin 48=49 Orchestr 49=50 Warm Str 52=53 ChoirStr 54=55 SynVox2 61=62 BrssSec2 63=64 SynBrss4 65=66 Sax Sect 66=67 BrthTnSx 81=82 PulseSaw 98=99 GlockChi 99=100 NylonEP [XG Bank 41] 0=01 Dream 2=03 ElGrPno2 5=06 DX+Analg 25=26 Stl&Body 28=29 MuteStlG 30=31 FeedbGt2 39=40 DX Bass 48=49 Orchstr2 49=50 Kingdom 54=55 Choral 61=62 HiBrass 63=64 ChoirBrs 66=67 SoftTenr 81=82 Dr. Lead 98=99 ClearBel [XG Bank 42] 5=06 DXKotoEP 48=49 TremOrch 61=62 MelloBrs 98=99 ChorBell [XG Bank 43 (Velo-Switch)] 24=25 VelGtHrm 28=29 FunkGtr2 29=30 Gt.Pinch 30=31 RkRythm2 33=34 FngrSlap 37=38 VeloSlap 65=66 HyprAlto [XG Bank 45 (Velo-Xfade)] 4=05 VX El.P1 5=06 VX El.P2 11=12 HardVibe 28=29 Jazz Man 30=31 RockRthm 32=33 VXUprght 33=34 FngBass2 48=49 VeloStr 62=63 AnaVelBr 63=64 VelBrss2 81=82 VeloLead 96=97 ClaviPad [XG Bank 6 (Single)] 39=40 MelloSB2 60=61 FrHrSolo 80=81 Square 2 81=82 Saw 2 [XG Bank 64 (other wave)] 4=05 60sEl.P 7=08 PulseClv 10=11 Orgel 12=13 SineMrmb 16=17 Organ Ba 18=19 RotaryOr 19=20 OrgFlute 23=24 TngoAcd2 27=28 CleanGt2 31=32 AcoHarmo 33=34 JazzBass 38=39 Oscar 39=40 X WireBa 49=50 70sStr 50=51 Syn Str4 52=53 StrngAah 53=54 VoiceDoo 54=55 AnaVoice 55=56 Impact 59=60 MuteTrp2 62=63 AnaBrss1 63=64 AnaBrss2 66=67 TnrSax 2 75=76 PanFlut2 80=81 Mellow 82=83 Vent Syn 83=84 Rubby 84=85 DistLead 85=86 VoxLead 87=88 Fat&Prky 88=89 Fantasy2 89=90 Horn Pad 90=91 PolyPd80 91=92 Heaven2 92=93 Glacier 93=94 Tine Pad 95=96 PolarPad 96=97 HrmoRain 97=98 Ancestrl 98=99 SynMalet 99=100 NylnHarp 100=101 FantaBel 101=102 GobSyn 102=103 EchoBell 103=104 Starz 108=109 BigKalim 111=112 Shanai2 117=118 Mel Tom2 118=119 Ana Tom 119=120 Rev Cym2 [XG Bank 65] 7=08 PierceCl 16=17 70sDrOr2 18=19 SloRotar 19=20 TrmOrgFl 31=32 GtFeedbk 33=34 ModAlem 38=39 SqrBass 49=50 Str Ens3 50=51 SS Str 52=53 Male Aah 55=56 BrssStab 80=81 SoloSine 82=83 Pure Pad 84=85 WireLead 87=88 SoftWurl 89=90 RotarStr 90=91 ClickPad 91=92 Lite Pad 92=93 GlassPad 93=94 Pan Pad 95=96 Sweepy 96=97 AfrcnWnd 97=98 Rave 98=99 SftCryst 99=100 Harp Vox 101=102 50sSciFi 102=103 Big Pan 103=104 Odyssey 117=118 Real Tom 118=119 ElecPerc [XG Bank 66] 16=17 CheezOrg 18=19 FstRotar 31=32 GtrHrmo2 38=39 RubberBa 55=56 DoublHit 80=81 SineLead 90=91 Ana Pad 91=92 Itopia 95=96 Celstial 96=97 Caribean 98=99 LoudGlok 99=100 AtmosPad 101=102 Ring Pad 102=103 SynPiano 117=118 Rock Tom [XG Bank 67] 16=17 DrawOrg3 55=56 BrStab80 90=91 SqarPad 91=92 CC Pad 98=99 XmasBell 99=100 Planet 101=102 Ritual 102=103 Creation [XG Bank 68] 98=99 VibeBell 101=102 ToHeaven 102=103 Stardust [XG Bank 69] 98=99 DigiBell 101=102 MilkyWay 102=103 Reso Pan [XG Bank 70] 98=99 AirBells 101=102 Night [XG Bank 71] 98=99 BellHarp 101=102 Glisten [XG Bank 72] 98=99 Gamelmba 101=102 Puffy [XG Bank 8 (Slow)] 40=41 Slow Vln 44=45 SlowTrStr 48=49 SlowStr 49=50 LegatoSt 80=81 LMSquare 81=82 ThickSaw 102=103 EchoPad2 [XG Bank 96] 12=13 Balafon 14=15 ChrchBel 15=16 Cimbalom 24=25 Ukulele 25=26 Mandolin 26=27 PdlSteel 28=29 Mu.DstGt 35=36 SynFret1 38=39 Hammer 53=54 VoiceHmn 56=57 FluglHrn 71=72 BassClar 75=76 Kawala 81=82 Seq Ana 100=101 Smokey 101=102 BelChoir 104=105 Tambra 105=106 Rabab 106=107 Tsugaru 107=108 T.Koto 111=112 Pungi 112=113 Bonang 113=114 Atrigane 114=115 Tablas 115=116 Castanet 116=117 Gr.Cassa 119=120 RevSnar1 [XG Bank 97] 12=13 Balafon2 14=15 Carillon 15=16 Santur 35=36 Smooth 104=105 Tamboura 105=106 Gopichnt 107=108 Kanoon 111=112 Hichriki 112=113 Gender 114=115 GlasPerc 119=120 RevSnar2 [XG Bank 98] 12=13 Log Drum 105=106 Oud 112=113 Gamelan 114=115 ThaiBell 119=120 RevKick1 [XG Bank 99] 112=113 S.Gamlan 119=120 RevConBD [XG Drum Kits] 0=1 Standard Kit 1=2 Standard Kit2 8=9 Room Kit 16=17 Rock Kit 24=25 Electro Kit 25=26 Analog Kit 32=33 Jazz Kit 40=41 Brush Kit 48=49 Classic Kit [XG Set channel to rhythm part] [XG SFX Bank] 0=1 CuttngNz 1=2 CuttngNz2 2=3 DstCutNz 3=4 Str Slap 4=5 B.Slide 5=6 P.Scrape 16=17 Fl.KClik 32=33 Rain 33=34 Thunder 34=35 Wind 35=36 Stream 36=37 Bubble 37=38 Feed 48=49 Dog 49=50 Horse 50=51 Bird 2 51=52 Kitty 52=53 Growl 53=54 Haunted 54=55 Ghost 55=56 Maou 64=65 Tel.Dial 65=66 DoorSqek 66=67 Door Slam 67=68 Scratch 68=69 Scratch 2 69=70 WindChm 70=71 Telphon2 80=81 CarEngin 81=82 Car Stop 82=83 Car Pass 83=84 CarCrash 84=85 Siren 85=86 Train 86=87 Jetplane 87=88 Starship 88=89 Burst 89=90 Coaster 90=91 SbMarine 96=97 Laughing 97=98 Scream 98=99 Punch 99=100 Heart 100=101 FootStep 101=102 Applaus2 112=113 MchinGun 113=114 LaserGun 114=115 Xplosion 115=116 FireWork [XG SFX Kits] 0=1 SFX 1 1=2 SFX 2 ; ---------------------------------------------------------------------- .Note Names [General MIDI Drums] 35=Acoustic Bass Drum 36=Bass Drum 1 37=Side Stick 38=Acoustic Snare 39=Hand Clap 40=Electric Snare 41=Low Floor Tom 42=Close Hi-Hat 43=High Floor Tom 44=Pedal Hi-Hat 45=Low Tom 46=Open Hi-Hat 47=Low-Mid Tom 48=Hi-Mid Tom 49=Crash Cymbal 1 50=High Tom 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Hi Bongo 61=Low Bongo 62=Mute Hi Conga 63=Open Hi Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Whistle 72=Long Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=Hi Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle [Roland GS Brush Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Jazz BD 2 36=Jazz BD 1 37=Side Stick 38=Brush Tap 39=Brush Slap 40=Brush Swirl 41=Low Tom 2 42=Closed Hi-Hat 43=Low Tom 1 44=Pedal Hi-Hat 45=Mid Tom 2 46=Open Hi-Hat 47=Mid Tom 1 48=High Tom 2 49=Crash Cymbal 1 50=High Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Electronic Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=Elec BD 37=Side Stick 38=Elec SD 39=Hand Clap 40=Gated SD 41=Elec Low Tom 2 42=Closed Hi-Hat 43=Elec Low Tom 1 44=Pedal Hi-Hat 45=Elec Mid Tom 2 46=Open Hi-Hat 47=Elec Mid Tom 1 48=Elec Hi Tom 2 49=Crash Cymbal 1 50=Elec Hi Tom 1 51=Ride Cymbal 1 52=Reverse Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Jazz Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Jazz BD 2 36=Jazz BD 1 37=Side Stick 38=Snare Drum 1 39=Hand Clap 40=Snare Drum 2 41=Low Tom 2 42=Closed Hi-Hat 43=Low Tom 1 44=Pedal Hi-Hat 45=Mid Tom 2 46=Open Hi-Hat 47=Mid Tom 1 48=High Tom 2 49=Crash Cymbal 1 50=High Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Orchestra Set] BasedOn=Roland GS Standard Set 27=Closed Hi-Hat 28=Pedal Hi-Hat 29=Open Hi-Hat 30=Ride Cymbal 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Concert BD 2 36=Concert BD 1 37=Side Stick 38=Concert SD 39=Castanets 40=Concert SD 41=Timpani F 42=Timpani F# 43=Timpani G 44=Timpani G# 45=Timpani A 46=Timpani A# 47=Timpani B 48=Timpani c 49=Timpani c# 50=Timpani d 51=Timpani d# 52=Timpani e 53=Timpani f 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Concert Cymbal 2 58=Vibra-slap 59=Concert Cymbal 1 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo 88=Applause [Roland GS Power Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=MONDO Kick 37=Side Stick 38=Gated SD 39=Hand Clap 40=Snare Drum 2 41=Room Low Tom 2 42=Closed Hi-Hat 43=Room Low Tom 1 44=Pedal Hi-Hat 45=Room Mid Tom 2 46=Open Hi-Hat 47=Room Mid Tom 1 48=Room Hi Tom 2 49=Crash Cymbal 1 50=Room Hi Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS Room Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=Kick Drum 1 37=Side Stick 38=Snare Drum 1 39=Hand Clap 40=Snare Drum 2 41=Room Low Tom 2 42=Closed Hi-Hat 43=Room Low Tom 1 44=Pedal Hi-Hat 45=Room Mid Tom 2 46=Open Hi-Hat 47=Room Mid Tom 1 48=Room Hi Tom 2 49=Crash Cymbal 1 50=Room Hi Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS SFX Set] 39=High Q 40=Slap 41=Scratch Push 42=Scratch Pull 43=Sticks 44=Square Click 45=Metronome Click 46=Metronome Bell 47=Guitar Sliding Finger 48=Guitar Cutting Noise (Down) 49=Guitar Cutting Noise (Up) 50=String Slap of Double Bass 51=Flute Key click 52=Laughing 53=Screaming 54=Punch 55=Heart Beat 56=Footsteps 1 57=Footsteps 2 58=Applause 59=Door Creaking 60=Door 61=Scratch 62=Windchime 63=Car-Engine 64=Car-Stop 65=Car-Pass 66=Car-Crash 67=Siren 68=Train 69=Jetplane 70=Helicopter 71=Starship 72=Gunshot 73=Machine Gun 74=Lasergun 75=Explosion 76=Dog 77=Horse-Gallop 78=Birds 79=Rain 80=Thunder 81=Wind 82=Seashore 83=Stream 84=Bubble [Roland GS Standard Set] 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=Kick Drum 1 37=Side Stick 38=Snare Drum 1 39=Hand Clap 40=Snare Drum 2 41=Low Tom 2 42=Closed Hi-Hat 43=Low Tom 1 44=Pedal Hi-Hat 45=Mid Tom 2 46=Open Hi-Hat 47=Mid Tom 1 48=High Tom 2 49=Crash Cymbal 1 50=High Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=Mute High Conga 63=Open High Conga 64=Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [Roland GS TR-808 Set] BasedOn=Roland GS Standard Set 27=High Q 28=Slap 29=Scratch Push 30=Scratch Pull 31=Sticks 32=Square Click 33=Metronome Click 34=Metronome Bell 35=Kick Drum 2 36=808 Bass Drum 37=808 Rim Shot 38=808 Snare Drum 39=Hand Clap 40=Snare Drum 2 41=808 Low Tom 2 42=808 CHH 43=808 Low Tom 1 44=808 CHH 45=808 Mid Tom 2 46=808 OHH 47=808 Mid Tom 1 48=808 Hi Tom 2 49=808 Cymbal 50=808 Hi Tom 1 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Bell 54=Tambourine 55=Splash Cymbal 56=808 Cowbell 57=Crash Cymbal 2 58=Vibra-slap 59=Ride Cymbal 2 60=High Bongo 61=Low Bongo 62=808 High Conga 63=808 Mid Conga 64=808 Low Conga 65=High Timbale 66=Low Timbale 67=High Agogo 68=Low Agogo 69=Cabasa 70=808 Maracas 71=Short Hi Whistle 72=Long Low Whistle 73=Short Guiro 74=Long Guiro 75=808 Claves 76=High Wood Block 77=Low Wood Block 78=Mute Cuica 79=Open Cuica 80=Mute Triangle 81=Open Triangle 82=Shaker 83=Jingle Bell 84=Belltree 85=Castanets 86=Mute Surdo 87=Open Surdo [XG Analog Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Reverse Cymbal 29=Snare Roll 30=Hi Q 31=SD Rock H 32=Sticks 33=Bass Drum M 34=Open Rim Shot 35=BD Analog L 36=BD Analog H 37=Analog Side Stick 38=Analog Snare L 39=Hand Clap 40=Analog Snare H 41=Analog Tom 1 42=Analog HH Closed 1 43=Analog Tom 2 44=Analog HH Closed 2 45=Analog Tom 3 46=Analog HH Open 47=Analog Tom 4 48=Analog Tom 5 49=Analog Cymbal 50=Analog Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Analog Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Analog Conga H 63=Analog Conga M 64=Analog Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Analog Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Analog Claves 76=Wood Block H 77=Wood Block L 78=Scratch Push 79=Scratch Pull 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Brush Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Brush Slap L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=BD Soft 37=Side Stick 38=Brush Slap 39=Hand Clap 40=Brush Tap 41=Brush Tom 1 42=Hi-Hat Closed 43=Brush Tom 2 44=Hi-Hat Pedal 45=Brush Tom 3 46=Hi-Hat Open 47=Brush Tom 4 48=Brush Tom 5 49=Crash Cymbal 1 50=Brush Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Classic Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=Gran Casa 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Jazz Tom 1 42=Hi-Hat Closed 43=Jazz Tom 2 44=Hi-Hat Pedal 45=Jazz Tom 3 46=Hi-Hat Open 47=Jazz Tom 4 48=Jazz Tom 5 49=Hand Cym.Open L 50=Jazz Tom 6 51=Hand Cym.Closed L 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Hand Cym.Open H 58=Vibraslap 59=Hand Cym.Closed H 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Electro Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Reverse Cymbal 29=Snare Roll 30=Hi Q 31=Snare M 32=Sticks 33=Bass Drum H 4 34=Open Rim Shot 35=BD Rock 36=BD Gate 37=Side Stick 38=SD Rock L 39=Hand Clap 40=SD Rock H 41=E Tom 1 42=Hi-Hat Closed 43=E Tom 2 44=Hi-Hat Pedal 45=E Tom 3 46=Hi-Hat Open 47=E Tom 4 48=E Tom 5 49=Crash Cymbal 1 50=E Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Scratch Push 79=Scratch Pull 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Jazz Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=BD Jazz 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Jazz Tom 1 42=Hi-Hat Closed 43=Jazz Tom 2 44=Hi-Hat Pedal 45=Jazz Tom 3 46=Hi-Hat Open 47=Jazz Tom 4 48=Jazz Tom 5 49=Crash Cymbal 1 50=Jazz Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Rock Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=SD Rock M 32=Sticks 33=Bass Drum M 34=Open Rim Shot 35=Bass Drum H 3 36=BD Rock 37=Side Stick 38=SD Rock 39=Hand Clap 40=SD Rock Rim 41=Rock Tom 1 42=Hi-Hat Closed 43=Rock Tom 2 44=Hi-Hat Pedal 45=Rock Tom 3 46=Hi-Hat Open 47=Rock Tom 4 48=Rock Tom 5 49=Crash Cymbal 1 50=Rock Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Room Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=BD Room 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Room Tom 1 42=Hi-Hat Closed 43=Room Tom 2 44=Hi-Hat Pedal 45=Room Tom 3 46=Hi-Hat Open 47=Room Tom 4 48=Room Tom 5 49=Crash Cymbal 1 50=Room Tom 6 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG SFX 1] 36=Guitar Cutting Noise 37=Guitar Cutting Noise 2 38=Dist. Cut Noise 39=String Slap 40=Bass Slide 41=Pick Scrape 52=FL.Key Click 68=Rain 69=Thunder 70=Wind 71=Stream 72=Bubble 73=Feed 84=Dog 85=Horse Gallop 86=Bird 2 87=Kitty 88=Growl 89=Haunted 90=Ghost 91=Maou [XG SFX 2] 36=Dial Tone 37=Door Creaking 38=Door Slam 39=Scratch 40=Scratch 2 41=Windchime 42=Telephone Ring2 52=Engine Start 53=Tire Screech 54=Car Passing 55=Crash 56=Siren 57=Train 58=Jetplane 59=Starship 60=Burst Noise 61=Coaster 62=SbMarine [XG Standard Kit] 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 35=Bass Drum M 36=Bass Drum H 37=Side Stick 38=Snare M 39=Hand Clap 40=Snare H 41=Floor Tom L 42=Hi-Hat Closed 43=Floor Tom H 44=Hi-Hat Pedal 45=Low Tom 46=Hi-Hat Open 47=Mid Tom L 48=Mid Tom H 49=Crash Cymbal 1 50=High Tom 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree [XG Standard2 Kit] BasedOn=XG Standard Kit 13=Surdo Mute 14=Surdo Open 15=Hi Q 16=Whip Slap 17=Scratch Push 18=Scratch Pull 19=Finger Snap 20=Click Noise 21=Metronome Click 22=Metronome Bell 23=Seq Click L 24=Seq Click H 25=Brush Tap 26=Brush Swirl L 27=Brush Slap 28=Brush Swirl H 29=Snare Roll 30=Castanet 31=Snare L 32=Sticks 33=Bass Drum L 34=Open Rim Shot 2 35=Bass Drum M 2 36=Bass Drum H 2 37=Side Stick 38=Snare M 2 39=Hand Clap 40=Snare H 2 41=Floor Tom L 42=Hi-Hat Closed 43=Floor Tom H 44=Hi-Hat Pedal 45=Low Tom 46=Hi-Hat Open 47=Mid Tom L 48=Mid Tom H 49=Crash Cymbal 1 50=High Tom 51=Ride Cymbal 1 52=Chinese Cymbal 53=Ride Cymbal Cup 54=Tambourine 55=Splash Cymbal 56=Cowbell 57=Crash Cymbal 2 58=Vibraslap 59=Ride Cymbal 2 60=Bongo H 61=Bongo L 62=Conga H Mute 63=Conga H Open 64=Conga L 65=Timbale H 66=Timbale L 67=Agogo H 68=Agogo L 69=Cabasa 70=Maracas 71=Samba Whistle H 72=Samba Whistle L 73=Guiro Short 74=Guiro Long 75=Claves 76=Wood Block H 77=Wood Block L 78=Cuica Mute 79=Cuica Open 80=Triangle Mute 81=Triangle Open 82=Shaker 83=Jingle Bell 84=Bell Tree ; ---------------------------------------------------------------------- .Controller Names [Roland GS Controllers] 1=1-Modulation 5=5-Portamento Time 6=6-Data Entry MSB 7=7-Volume 10=10-Pan 11=11-Expression 38=38-Data Entry LSB 64=64-Hold 1 65=65-Portamento 66=66-Sostenuto 67=67-Soft 84=84-Portamento Control 91=91-Effect1 (Reverb Send Level) 93=93-Effect3 (Chorus Send Level) 98=98-NRPN LSB 99=99-NRPN MSB 100=100-RPN LSB 101=101-RPN MSB [Standard] 1=1-Modulation 2=2-Breath 4=4-Foot controller 5=5-Portamento time 7=7-Volume 8=8-Balance 10=10-Pan 11=11-Expression 64=64-Pedal (sustain) 65=65-Portamento 66=66-Pedal (sostenuto) 67=67-Pedal (soft) 69=69-Hold 2 91=91-External Effects depth 92=92-Tremolo depth 93=93-Chorus depth 94=94-Celeste (detune) depth 95=95-Phaser depth [Yamaha XG Controllers] 0=0-Bank Select MSB 1=1-Modulation 5=5-Portamento Time 6=6-Data Entry MSB 7=7-Master Volume 10=10-Panpot 11=11-Expression 32=32-Bank Select LSB 38=38-Data Entry LSB 64=64-Sustain 65=65-Portamento 66=66-Sostenuto 67=67-Soft Pedal 71=71-Harmonic Content 72=72-Release Time 73=73-Attack Time 74=74-Brightness 84=84-Portamento Control 91=91-Effects Send Level 1 (reverb) 93=93-Effects Send Level 3 (chorus) 94=94-Effects Send Level 4 (variation) 96=96-RPN Increment 97=97-RPN Decrement 98=98-NRPN LSB 99=99-NRPN MSB 100=100-RPN LSB 101=101-RPN MSB 120=120-All Sound Off 121=121-Reset All Controllers 123=123-All Notes Off 124=124-OMNI Off 125=125-OMNI On 126=126-Mono 127=127-Poly ; ---------------------------------------------------------------------- .RPN Names [Standard] 0=Pitch Bend Range 1=Fine Tuning 2=Coarse Tuning 3=Tuning Program Select 4=Tuning Bank Select ; ---------------------------------------------------------------------- .NRPN Names [Roland GS NRPN] 136=Vibrato Rate 137=Vibrato Depth 138=Vibrato Delay 160=TVF Cutoff Frequency 161=TVF Resonance 227=TVF&TVA Envelope Attack Time 228=TVF&TVA Envelope Decay Time 230=TVF&TVA Envelope Release Time 3072=Drum Instrument Pitch Coarse #0 3073=Drum Instrument Pitch Coarse #1 3074=Drum Instrument Pitch Coarse #2 3075=Drum Instrument Pitch Coarse #3 3076=Drum Instrument Pitch Coarse #4 3077=Drum Instrument Pitch Coarse #5 3078=Drum Instrument Pitch Coarse #6 3079=Drum Instrument Pitch Coarse #7 3080=Drum Instrument Pitch Coarse #8 3081=Drum Instrument Pitch Coarse #9 3082=Drum Instrument Pitch Coarse #10 3083=Drum Instrument Pitch Coarse #11 3084=Drum Instrument Pitch Coarse #12 3085=Drum Instrument Pitch Coarse #13 3086=Drum Instrument Pitch Coarse #14 3087=Drum Instrument Pitch Coarse #15 3088=Drum Instrument Pitch Coarse #16 3089=Drum Instrument Pitch Coarse #17 3090=Drum Instrument Pitch Coarse #18 3091=Drum Instrument Pitch Coarse #19 3092=Drum Instrument Pitch Coarse #20 3093=Drum Instrument Pitch Coarse #21 3094=Drum Instrument Pitch Coarse #22 3095=Drum Instrument Pitch Coarse #23 3096=Drum Instrument Pitch Coarse #24 3097=Drum Instrument Pitch Coarse #25 3098=Drum Instrument Pitch Coarse #26 3099=Drum Instrument Pitch Coarse #27 3100=Drum Instrument Pitch Coarse #28 3101=Drum Instrument Pitch Coarse #29 3102=Drum Instrument Pitch Coarse #30 3103=Drum Instrument Pitch Coarse #31 3104=Drum Instrument Pitch Coarse #32 3105=Drum Instrument Pitch Coarse #33 3106=Drum Instrument Pitch Coarse #34 3107=Drum Instrument Pitch Coarse #35 3108=Drum Instrument Pitch Coarse #36 3109=Drum Instrument Pitch Coarse #37 3110=Drum Instrument Pitch Coarse #38 3111=Drum Instrument Pitch Coarse #39 3112=Drum Instrument Pitch Coarse #40 3113=Drum Instrument Pitch Coarse #41 3114=Drum Instrument Pitch Coarse #42 3115=Drum Instrument Pitch Coarse #43 3116=Drum Instrument Pitch Coarse #44 3117=Drum Instrument Pitch Coarse #45 3118=Drum Instrument Pitch Coarse #46 3119=Drum Instrument Pitch Coarse #47 3120=Drum Instrument Pitch Coarse #48 3121=Drum Instrument Pitch Coarse #49 3122=Drum Instrument Pitch Coarse #50 3123=Drum Instrument Pitch Coarse #51 3124=Drum Instrument Pitch Coarse #52 3125=Drum Instrument Pitch Coarse #53 3126=Drum Instrument Pitch Coarse #54 3127=Drum Instrument Pitch Coarse #55 3128=Drum Instrument Pitch Coarse #56 3129=Drum Instrument Pitch Coarse #57 3130=Drum Instrument Pitch Coarse #58 3131=Drum Instrument Pitch Coarse #59 3132=Drum Instrument Pitch Coarse #60 3133=Drum Instrument Pitch Coarse #61 3134=Drum Instrument Pitch Coarse #62 3135=Drum Instrument Pitch Coarse #63 3136=Drum Instrument Pitch Coarse #64 3137=Drum Instrument Pitch Coarse #65 3138=Drum Instrument Pitch Coarse #66 3139=Drum Instrument Pitch Coarse #67 3140=Drum Instrument Pitch Coarse #68 3141=Drum Instrument Pitch Coarse #69 3142=Drum Instrument Pitch Coarse #70 3143=Drum Instrument Pitch Coarse #71 3144=Drum Instrument Pitch Coarse #72 3145=Drum Instrument Pitch Coarse #73 3146=Drum Instrument Pitch Coarse #74 3147=Drum Instrument Pitch Coarse #75 3148=Drum Instrument Pitch Coarse #76 3149=Drum Instrument Pitch Coarse #77 3150=Drum Instrument Pitch Coarse #78 3151=Drum Instrument Pitch Coarse #79 3152=Drum Instrument Pitch Coarse #80 3153=Drum Instrument Pitch Coarse #81 3154=Drum Instrument Pitch Coarse #82 3155=Drum Instrument Pitch Coarse #83 3156=Drum Instrument Pitch Coarse #84 3157=Drum Instrument Pitch Coarse #85 3158=Drum Instrument Pitch Coarse #86 3159=Drum Instrument Pitch Coarse #87 3160=Drum Instrument Pitch Coarse #88 3161=Drum Instrument Pitch Coarse #89 3162=Drum Instrument Pitch Coarse #90 3163=Drum Instrument Pitch Coarse #91 3164=Drum Instrument Pitch Coarse #92 3165=Drum Instrument Pitch Coarse #93 3166=Drum Instrument Pitch Coarse #94 3167=Drum Instrument Pitch Coarse #95 3168=Drum Instrument Pitch Coarse #96 3169=Drum Instrument Pitch Coarse #97 3170=Drum Instrument Pitch Coarse #98 3171=Drum Instrument Pitch Coarse #99 3172=Drum Instrument Pitch Coarse #100 3173=Drum Instrument Pitch Coarse #101 3174=Drum Instrument Pitch Coarse #102 3175=Drum Instrument Pitch Coarse #103 3176=Drum Instrument Pitch Coarse #104 3177=Drum Instrument Pitch Coarse #105 3178=Drum Instrument Pitch Coarse #106 3179=Drum Instrument Pitch Coarse #107 3180=Drum Instrument Pitch Coarse #108 3181=Drum Instrument Pitch Coarse #109 3182=Drum Instrument Pitch Coarse #110 3183=Drum Instrument Pitch Coarse #111 3184=Drum Instrument Pitch Coarse #112 3185=Drum Instrument Pitch Coarse #113 3186=Drum Instrument Pitch Coarse #114 3187=Drum Instrument Pitch Coarse #115 3188=Drum Instrument Pitch Coarse #116 3189=Drum Instrument Pitch Coarse #117 3190=Drum Instrument Pitch Coarse #118 3191=Drum Instrument Pitch Coarse #119 3192=Drum Instrument Pitch Coarse #120 3193=Drum Instrument Pitch Coarse #121 3194=Drum Instrument Pitch Coarse #122 3195=Drum Instrument Pitch Coarse #123 3196=Drum Instrument Pitch Coarse #124 3197=Drum Instrument Pitch Coarse #125 3198=Drum Instrument Pitch Coarse #126 3199=Drum Instrument Pitch Coarse #127 3328=Drum Instrument TVA Level #0 3329=Drum Instrument TVA Level #1 3330=Drum Instrument TVA Level #2 3331=Drum Instrument TVA Level #3 3332=Drum Instrument TVA Level #4 3333=Drum Instrument TVA Level #5 3334=Drum Instrument TVA Level #6 3335=Drum Instrument TVA Level #7 3336=Drum Instrument TVA Level #8 3337=Drum Instrument TVA Level #9 3338=Drum Instrument TVA Level #10 3339=Drum Instrument TVA Level #11 3340=Drum Instrument TVA Level #12 3341=Drum Instrument TVA Level #13 3342=Drum Instrument TVA Level #14 3343=Drum Instrument TVA Level #15 3344=Drum Instrument TVA Level #16 3345=Drum Instrument TVA Level #17 3346=Drum Instrument TVA Level #18 3347=Drum Instrument TVA Level #19 3348=Drum Instrument TVA Level #20 3349=Drum Instrument TVA Level #21 3350=Drum Instrument TVA Level #22 3351=Drum Instrument TVA Level #23 3352=Drum Instrument TVA Level #24 3353=Drum Instrument TVA Level #25 3354=Drum Instrument TVA Level #26 3355=Drum Instrument TVA Level #27 3356=Drum Instrument TVA Level #28 3357=Drum Instrument TVA Level #29 3358=Drum Instrument TVA Level #30 3359=Drum Instrument TVA Level #31 3360=Drum Instrument TVA Level #32 3361=Drum Instrument TVA Level #33 3362=Drum Instrument TVA Level #34 3363=Drum Instrument TVA Level #35 3364=Drum Instrument TVA Level #36 3365=Drum Instrument TVA Level #37 3366=Drum Instrument TVA Level #38 3367=Drum Instrument TVA Level #39 3368=Drum Instrument TVA Level #40 3369=Drum Instrument TVA Level #41 3370=Drum Instrument TVA Level #42 3371=Drum Instrument TVA Level #43 3372=Drum Instrument TVA Level #44 3373=Drum Instrument TVA Level #45 3374=Drum Instrument TVA Level #46 3375=Drum Instrument TVA Level #47 3376=Drum Instrument TVA Level #48 3377=Drum Instrument TVA Level #49 3378=Drum Instrument TVA Level #50 3379=Drum Instrument TVA Level #51 3380=Drum Instrument TVA Level #52 3381=Drum Instrument TVA Level #53 3382=Drum Instrument TVA Level #54 3383=Drum Instrument TVA Level #55 3384=Drum Instrument TVA Level #56 3385=Drum Instrument TVA Level #57 3386=Drum Instrument TVA Level #58 3387=Drum Instrument TVA Level #59 3388=Drum Instrument TVA Level #60 3389=Drum Instrument TVA Level #61 3390=Drum Instrument TVA Level #62 3391=Drum Instrument TVA Level #63 3392=Drum Instrument TVA Level #64 3393=Drum Instrument TVA Level #65 3394=Drum Instrument TVA Level #66 3395=Drum Instrument TVA Level #67 3396=Drum Instrument TVA Level #68 3397=Drum Instrument TVA Level #69 3398=Drum Instrument TVA Level #70 3399=Drum Instrument TVA Level #71 3400=Drum Instrument TVA Level #72 3401=Drum Instrument TVA Level #73 3402=Drum Instrument TVA Level #74 3403=Drum Instrument TVA Level #75 3404=Drum Instrument TVA Level #76 3405=Drum Instrument TVA Level #77 3406=Drum Instrument TVA Level #78 3407=Drum Instrument TVA Level #79 3408=Drum Instrument TVA Level #80 3409=Drum Instrument TVA Level #81 3410=Drum Instrument TVA Level #82 3411=Drum Instrument TVA Level #83 3412=Drum Instrument TVA Level #84 3413=Drum Instrument TVA Level #85 3414=Drum Instrument TVA Level #86 3415=Drum Instrument TVA Level #87 3416=Drum Instrument TVA Level #88 3417=Drum Instrument TVA Level #89 3418=Drum Instrument TVA Level #90 3419=Drum Instrument TVA Level #91 3420=Drum Instrument TVA Level #92 3421=Drum Instrument TVA Level #93 3422=Drum Instrument TVA Level #94 3423=Drum Instrument TVA Level #95 3424=Drum Instrument TVA Level #96 3425=Drum Instrument TVA Level #97 3426=Drum Instrument TVA Level #98 3427=Drum Instrument TVA Level #99 3428=Drum Instrument TVA Level #100 3429=Drum Instrument TVA Level #101 3430=Drum Instrument TVA Level #102 3431=Drum Instrument TVA Level #103 3432=Drum Instrument TVA Level #104 3433=Drum Instrument TVA Level #105 3434=Drum Instrument TVA Level #106 3435=Drum Instrument TVA Level #107 3436=Drum Instrument TVA Level #108 3437=Drum Instrument TVA Level #109 3438=Drum Instrument TVA Level #110 3439=Drum Instrument TVA Level #111 3440=Drum Instrument TVA Level #112 3441=Drum Instrument TVA Level #113 3442=Drum Instrument TVA Level #114 3443=Drum Instrument TVA Level #115 3444=Drum Instrument TVA Level #116 3445=Drum Instrument TVA Level #117 3446=Drum Instrument TVA Level #118 3447=Drum Instrument TVA Level #119 3448=Drum Instrument TVA Level #120 3449=Drum Instrument TVA Level #121 3450=Drum Instrument TVA Level #122 3451=Drum Instrument TVA Level #123 3452=Drum Instrument TVA Level #124 3453=Drum Instrument TVA Level #125 3454=Drum Instrument TVA Level #126 3455=Drum Instrument TVA Level #127 3584=Drum Instrument Panpot #0 3585=Drum Instrument Panpot #1 3586=Drum Instrument Panpot #2 3587=Drum Instrument Panpot #3 3588=Drum Instrument Panpot #4 3589=Drum Instrument Panpot #5 3590=Drum Instrument Panpot #6 3591=Drum Instrument Panpot #7 3592=Drum Instrument Panpot #8 3593=Drum Instrument Panpot #9 3594=Drum Instrument Panpot #10 3595=Drum Instrument Panpot #11 3596=Drum Instrument Panpot #12 3597=Drum Instrument Panpot #13 3598=Drum Instrument Panpot #14 3599=Drum Instrument Panpot #15 3600=Drum Instrument Panpot #16 3601=Drum Instrument Panpot #17 3602=Drum Instrument Panpot #18 3603=Drum Instrument Panpot #19 3604=Drum Instrument Panpot #20 3605=Drum Instrument Panpot #21 3606=Drum Instrument Panpot #22 3607=Drum Instrument Panpot #23 3608=Drum Instrument Panpot #24 3609=Drum Instrument Panpot #25 3610=Drum Instrument Panpot #26 3611=Drum Instrument Panpot #27 3612=Drum Instrument Panpot #28 3613=Drum Instrument Panpot #29 3614=Drum Instrument Panpot #30 3615=Drum Instrument Panpot #31 3616=Drum Instrument Panpot #32 3617=Drum Instrument Panpot #33 3618=Drum Instrument Panpot #34 3619=Drum Instrument Panpot #35 3620=Drum Instrument Panpot #36 3621=Drum Instrument Panpot #37 3622=Drum Instrument Panpot #38 3623=Drum Instrument Panpot #39 3624=Drum Instrument Panpot #40 3625=Drum Instrument Panpot #41 3626=Drum Instrument Panpot #42 3627=Drum Instrument Panpot #43 3628=Drum Instrument Panpot #44 3629=Drum Instrument Panpot #45 3630=Drum Instrument Panpot #46 3631=Drum Instrument Panpot #47 3632=Drum Instrument Panpot #48 3633=Drum Instrument Panpot #49 3634=Drum Instrument Panpot #50 3635=Drum Instrument Panpot #51 3636=Drum Instrument Panpot #52 3637=Drum Instrument Panpot #53 3638=Drum Instrument Panpot #54 3639=Drum Instrument Panpot #55 3640=Drum Instrument Panpot #56 3641=Drum Instrument Panpot #57 3642=Drum Instrument Panpot #58 3643=Drum Instrument Panpot #59 3644=Drum Instrument Panpot #60 3645=Drum Instrument Panpot #61 3646=Drum Instrument Panpot #62 3647=Drum Instrument Panpot #63 3648=Drum Instrument Panpot #64 3649=Drum Instrument Panpot #65 3650=Drum Instrument Panpot #66 3651=Drum Instrument Panpot #67 3652=Drum Instrument Panpot #68 3653=Drum Instrument Panpot #69 3654=Drum Instrument Panpot #70 3655=Drum Instrument Panpot #71 3656=Drum Instrument Panpot #72 3657=Drum Instrument Panpot #73 3658=Drum Instrument Panpot #74 3659=Drum Instrument Panpot #75 3660=Drum Instrument Panpot #76 3661=Drum Instrument Panpot #77 3662=Drum Instrument Panpot #78 3663=Drum Instrument Panpot #79 3664=Drum Instrument Panpot #80 3665=Drum Instrument Panpot #81 3666=Drum Instrument Panpot #82 3667=Drum Instrument Panpot #83 3668=Drum Instrument Panpot #84 3669=Drum Instrument Panpot #85 3670=Drum Instrument Panpot #86 3671=Drum Instrument Panpot #87 3672=Drum Instrument Panpot #88 3673=Drum Instrument Panpot #89 3674=Drum Instrument Panpot #90 3675=Drum Instrument Panpot #91 3676=Drum Instrument Panpot #92 3677=Drum Instrument Panpot #93 3678=Drum Instrument Panpot #94 3679=Drum Instrument Panpot #95 3680=Drum Instrument Panpot #96 3681=Drum Instrument Panpot #97 3682=Drum Instrument Panpot #98 3683=Drum Instrument Panpot #99 3684=Drum Instrument Panpot #100 3685=Drum Instrument Panpot #101 3686=Drum Instrument Panpot #102 3687=Drum Instrument Panpot #103 3688=Drum Instrument Panpot #104 3689=Drum Instrument Panpot #105 3690=Drum Instrument Panpot #106 3691=Drum Instrument Panpot #107 3692=Drum Instrument Panpot #108 3693=Drum Instrument Panpot #109 3694=Drum Instrument Panpot #110 3695=Drum Instrument Panpot #111 3696=Drum Instrument Panpot #112 3697=Drum Instrument Panpot #113 3698=Drum Instrument Panpot #114 3699=Drum Instrument Panpot #115 3700=Drum Instrument Panpot #116 3701=Drum Instrument Panpot #117 3702=Drum Instrument Panpot #118 3703=Drum Instrument Panpot #119 3704=Drum Instrument Panpot #120 3705=Drum Instrument Panpot #121 3706=Drum Instrument Panpot #122 3707=Drum Instrument Panpot #123 3708=Drum Instrument Panpot #124 3709=Drum Instrument Panpot #125 3710=Drum Instrument Panpot #126 3711=Drum Instrument Panpot #127 3712=Drum Instrument Reverb Send Level #0 3713=Drum Instrument Reverb Send Level #1 3714=Drum Instrument Reverb Send Level #2 3715=Drum Instrument Reverb Send Level #3 3716=Drum Instrument Reverb Send Level #4 3717=Drum Instrument Reverb Send Level #5 3718=Drum Instrument Reverb Send Level #6 3719=Drum Instrument Reverb Send Level #7 3720=Drum Instrument Reverb Send Level #8 3721=Drum Instrument Reverb Send Level #9 3722=Drum Instrument Reverb Send Level #10 3723=Drum Instrument Reverb Send Level #11 3724=Drum Instrument Reverb Send Level #12 3725=Drum Instrument Reverb Send Level #13 3726=Drum Instrument Reverb Send Level #14 3727=Drum Instrument Reverb Send Level #15 3728=Drum Instrument Reverb Send Level #16 3729=Drum Instrument Reverb Send Level #17 3730=Drum Instrument Reverb Send Level #18 3731=Drum Instrument Reverb Send Level #19 3732=Drum Instrument Reverb Send Level #20 3733=Drum Instrument Reverb Send Level #21 3734=Drum Instrument Reverb Send Level #22 3735=Drum Instrument Reverb Send Level #23 3736=Drum Instrument Reverb Send Level #24 3737=Drum Instrument Reverb Send Level #25 3738=Drum Instrument Reverb Send Level #26 3739=Drum Instrument Reverb Send Level #27 3740=Drum Instrument Reverb Send Level #28 3741=Drum Instrument Reverb Send Level #29 3742=Drum Instrument Reverb Send Level #30 3743=Drum Instrument Reverb Send Level #31 3744=Drum Instrument Reverb Send Level #32 3745=Drum Instrument Reverb Send Level #33 3746=Drum Instrument Reverb Send Level #34 3747=Drum Instrument Reverb Send Level #35 3748=Drum Instrument Reverb Send Level #36 3749=Drum Instrument Reverb Send Level #37 3750=Drum Instrument Reverb Send Level #38 3751=Drum Instrument Reverb Send Level #39 3752=Drum Instrument Reverb Send Level #40 3753=Drum Instrument Reverb Send Level #41 3754=Drum Instrument Reverb Send Level #42 3755=Drum Instrument Reverb Send Level #43 3756=Drum Instrument Reverb Send Level #44 3757=Drum Instrument Reverb Send Level #45 3758=Drum Instrument Reverb Send Level #46 3759=Drum Instrument Reverb Send Level #47 3760=Drum Instrument Reverb Send Level #48 3761=Drum Instrument Reverb Send Level #49 3762=Drum Instrument Reverb Send Level #50 3763=Drum Instrument Reverb Send Level #51 3764=Drum Instrument Reverb Send Level #52 3765=Drum Instrument Reverb Send Level #53 3766=Drum Instrument Reverb Send Level #54 3767=Drum Instrument Reverb Send Level #55 3768=Drum Instrument Reverb Send Level #56 3769=Drum Instrument Reverb Send Level #57 3770=Drum Instrument Reverb Send Level #58 3771=Drum Instrument Reverb Send Level #59 3772=Drum Instrument Reverb Send Level #60 3773=Drum Instrument Reverb Send Level #61 3774=Drum Instrument Reverb Send Level #62 3775=Drum Instrument Reverb Send Level #63 3776=Drum Instrument Reverb Send Level #64 3777=Drum Instrument Reverb Send Level #65 3778=Drum Instrument Reverb Send Level #66 3779=Drum Instrument Reverb Send Level #67 3780=Drum Instrument Reverb Send Level #68 3781=Drum Instrument Reverb Send Level #69 3782=Drum Instrument Reverb Send Level #70 3783=Drum Instrument Reverb Send Level #71 3784=Drum Instrument Reverb Send Level #72 3785=Drum Instrument Reverb Send Level #73 3786=Drum Instrument Reverb Send Level #74 3787=Drum Instrument Reverb Send Level #75 3788=Drum Instrument Reverb Send Level #76 3789=Drum Instrument Reverb Send Level #77 3790=Drum Instrument Reverb Send Level #78 3791=Drum Instrument Reverb Send Level #79 3792=Drum Instrument Reverb Send Level #80 3793=Drum Instrument Reverb Send Level #81 3794=Drum Instrument Reverb Send Level #82 3795=Drum Instrument Reverb Send Level #83 3796=Drum Instrument Reverb Send Level #84 3797=Drum Instrument Reverb Send Level #85 3798=Drum Instrument Reverb Send Level #86 3799=Drum Instrument Reverb Send Level #87 3800=Drum Instrument Reverb Send Level #88 3801=Drum Instrument Reverb Send Level #89 3802=Drum Instrument Reverb Send Level #90 3803=Drum Instrument Reverb Send Level #91 3804=Drum Instrument Reverb Send Level #92 3805=Drum Instrument Reverb Send Level #93 3806=Drum Instrument Reverb Send Level #94 3807=Drum Instrument Reverb Send Level #95 3808=Drum Instrument Reverb Send Level #96 3809=Drum Instrument Reverb Send Level #97 3810=Drum Instrument Reverb Send Level #98 3811=Drum Instrument Reverb Send Level #99 3812=Drum Instrument Reverb Send Level #100 3813=Drum Instrument Reverb Send Level #101 3814=Drum Instrument Reverb Send Level #102 3815=Drum Instrument Reverb Send Level #103 3816=Drum Instrument Reverb Send Level #104 3817=Drum Instrument Reverb Send Level #105 3818=Drum Instrument Reverb Send Level #106 3819=Drum Instrument Reverb Send Level #107 3820=Drum Instrument Reverb Send Level #108 3821=Drum Instrument Reverb Send Level #109 3822=Drum Instrument Reverb Send Level #110 3823=Drum Instrument Reverb Send Level #111 3824=Drum Instrument Reverb Send Level #112 3825=Drum Instrument Reverb Send Level #113 3826=Drum Instrument Reverb Send Level #114 3827=Drum Instrument Reverb Send Level #115 3828=Drum Instrument Reverb Send Level #116 3829=Drum Instrument Reverb Send Level #117 3830=Drum Instrument Reverb Send Level #118 3831=Drum Instrument Reverb Send Level #119 3832=Drum Instrument Reverb Send Level #120 3833=Drum Instrument Reverb Send Level #121 3834=Drum Instrument Reverb Send Level #122 3835=Drum Instrument Reverb Send Level #123 3836=Drum Instrument Reverb Send Level #124 3837=Drum Instrument Reverb Send Level #125 3838=Drum Instrument Reverb Send Level #126 3839=Drum Instrument Reverb Send Level #127 3840=Drum Instrument Chorus Send Level #0 3841=Drum Instrument Chorus Send Level #1 3842=Drum Instrument Chorus Send Level #2 3843=Drum Instrument Chorus Send Level #3 3844=Drum Instrument Chorus Send Level #4 3845=Drum Instrument Chorus Send Level #5 3846=Drum Instrument Chorus Send Level #6 3847=Drum Instrument Chorus Send Level #7 3848=Drum Instrument Chorus Send Level #8 3849=Drum Instrument Chorus Send Level #9 3850=Drum Instrument Chorus Send Level #10 3851=Drum Instrument Chorus Send Level #11 3852=Drum Instrument Chorus Send Level #12 3853=Drum Instrument Chorus Send Level #13 3854=Drum Instrument Chorus Send Level #14 3855=Drum Instrument Chorus Send Level #15 3856=Drum Instrument Chorus Send Level #16 3857=Drum Instrument Chorus Send Level #17 3858=Drum Instrument Chorus Send Level #18 3859=Drum Instrument Chorus Send Level #19 3860=Drum Instrument Chorus Send Level #20 3861=Drum Instrument Chorus Send Level #21 3862=Drum Instrument Chorus Send Level #22 3863=Drum Instrument Chorus Send Level #23 3864=Drum Instrument Chorus Send Level #24 3865=Drum Instrument Chorus Send Level #25 3866=Drum Instrument Chorus Send Level #26 3867=Drum Instrument Chorus Send Level #27 3868=Drum Instrument Chorus Send Level #28 3869=Drum Instrument Chorus Send Level #29 3870=Drum Instrument Chorus Send Level #30 3871=Drum Instrument Chorus Send Level #31 3872=Drum Instrument Chorus Send Level #32 3873=Drum Instrument Chorus Send Level #33 3874=Drum Instrument Chorus Send Level #34 3875=Drum Instrument Chorus Send Level #35 3876=Drum Instrument Chorus Send Level #36 3877=Drum Instrument Chorus Send Level #37 3878=Drum Instrument Chorus Send Level #38 3879=Drum Instrument Chorus Send Level #39 3880=Drum Instrument Chorus Send Level #40 3881=Drum Instrument Chorus Send Level #41 3882=Drum Instrument Chorus Send Level #42 3883=Drum Instrument Chorus Send Level #43 3884=Drum Instrument Chorus Send Level #44 3885=Drum Instrument Chorus Send Level #45 3886=Drum Instrument Chorus Send Level #46 3887=Drum Instrument Chorus Send Level #47 3888=Drum Instrument Chorus Send Level #48 3889=Drum Instrument Chorus Send Level #49 3890=Drum Instrument Chorus Send Level #50 3891=Drum Instrument Chorus Send Level #51 3892=Drum Instrument Chorus Send Level #52 3893=Drum Instrument Chorus Send Level #53 3894=Drum Instrument Chorus Send Level #54 3895=Drum Instrument Chorus Send Level #55 3896=Drum Instrument Chorus Send Level #56 3897=Drum Instrument Chorus Send Level #57 3898=Drum Instrument Chorus Send Level #58 3899=Drum Instrument Chorus Send Level #59 3900=Drum Instrument Chorus Send Level #60 3901=Drum Instrument Chorus Send Level #61 3902=Drum Instrument Chorus Send Level #62 3903=Drum Instrument Chorus Send Level #63 3904=Drum Instrument Chorus Send Level #64 3905=Drum Instrument Chorus Send Level #65 3906=Drum Instrument Chorus Send Level #66 3907=Drum Instrument Chorus Send Level #67 3908=Drum Instrument Chorus Send Level #68 3909=Drum Instrument Chorus Send Level #69 3910=Drum Instrument Chorus Send Level #70 3911=Drum Instrument Chorus Send Level #71 3912=Drum Instrument Chorus Send Level #72 3913=Drum Instrument Chorus Send Level #73 3914=Drum Instrument Chorus Send Level #74 3915=Drum Instrument Chorus Send Level #75 3916=Drum Instrument Chorus Send Level #76 3917=Drum Instrument Chorus Send Level #77 3918=Drum Instrument Chorus Send Level #78 3919=Drum Instrument Chorus Send Level #79 3920=Drum Instrument Chorus Send Level #80 3921=Drum Instrument Chorus Send Level #81 3922=Drum Instrument Chorus Send Level #82 3923=Drum Instrument Chorus Send Level #83 3924=Drum Instrument Chorus Send Level #84 3925=Drum Instrument Chorus Send Level #85 3926=Drum Instrument Chorus Send Level #86 3927=Drum Instrument Chorus Send Level #87 3928=Drum Instrument Chorus Send Level #88 3929=Drum Instrument Chorus Send Level #89 3930=Drum Instrument Chorus Send Level #90 3931=Drum Instrument Chorus Send Level #91 3932=Drum Instrument Chorus Send Level #92 3933=Drum Instrument Chorus Send Level #93 3934=Drum Instrument Chorus Send Level #94 3935=Drum Instrument Chorus Send Level #95 3936=Drum Instrument Chorus Send Level #96 3937=Drum Instrument Chorus Send Level #97 3938=Drum Instrument Chorus Send Level #98 3939=Drum Instrument Chorus Send Level #99 3940=Drum Instrument Chorus Send Level #100 3941=Drum Instrument Chorus Send Level #101 3942=Drum Instrument Chorus Send Level #102 3943=Drum Instrument Chorus Send Level #103 3944=Drum Instrument Chorus Send Level #104 3945=Drum Instrument Chorus Send Level #105 3946=Drum Instrument Chorus Send Level #106 3947=Drum Instrument Chorus Send Level #107 3948=Drum Instrument Chorus Send Level #108 3949=Drum Instrument Chorus Send Level #109 3950=Drum Instrument Chorus Send Level #110 3951=Drum Instrument Chorus Send Level #111 3952=Drum Instrument Chorus Send Level #112 3953=Drum Instrument Chorus Send Level #113 3954=Drum Instrument Chorus Send Level #114 3955=Drum Instrument Chorus Send Level #115 3956=Drum Instrument Chorus Send Level #116 3957=Drum Instrument Chorus Send Level #117 3958=Drum Instrument Chorus Send Level #118 3959=Drum Instrument Chorus Send Level #119 3960=Drum Instrument Chorus Send Level #120 3961=Drum Instrument Chorus Send Level #121 3962=Drum Instrument Chorus Send Level #122 3963=Drum Instrument Chorus Send Level #123 3964=Drum Instrument Chorus Send Level #124 3965=Drum Instrument Chorus Send Level #125 3966=Drum Instrument Chorus Send Level #126 3967=Drum Instrument Chorus Send Level #127 3968=Drum Instrument Delay Send Level #0 3969=Drum Instrument Delay Send Level #1 3970=Drum Instrument Delay Send Level #2 3971=Drum Instrument Delay Send Level #3 3972=Drum Instrument Delay Send Level #4 3973=Drum Instrument Delay Send Level #5 3974=Drum Instrument Delay Send Level #6 3975=Drum Instrument Delay Send Level #7 3976=Drum Instrument Delay Send Level #8 3977=Drum Instrument Delay Send Level #9 3978=Drum Instrument Delay Send Level #10 3979=Drum Instrument Delay Send Level #11 3980=Drum Instrument Delay Send Level #12 3981=Drum Instrument Delay Send Level #13 3982=Drum Instrument Delay Send Level #14 3983=Drum Instrument Delay Send Level #15 3984=Drum Instrument Delay Send Level #16 3985=Drum Instrument Delay Send Level #17 3986=Drum Instrument Delay Send Level #18 3987=Drum Instrument Delay Send Level #19 3988=Drum Instrument Delay Send Level #20 3989=Drum Instrument Delay Send Level #21 3990=Drum Instrument Delay Send Level #22 3991=Drum Instrument Delay Send Level #23 3992=Drum Instrument Delay Send Level #24 3993=Drum Instrument Delay Send Level #25 3994=Drum Instrument Delay Send Level #26 3995=Drum Instrument Delay Send Level #27 3996=Drum Instrument Delay Send Level #28 3997=Drum Instrument Delay Send Level #29 3998=Drum Instrument Delay Send Level #30 3999=Drum Instrument Delay Send Level #31 4000=Drum Instrument Delay Send Level #32 4001=Drum Instrument Delay Send Level #33 4002=Drum Instrument Delay Send Level #34 4003=Drum Instrument Delay Send Level #35 4004=Drum Instrument Delay Send Level #36 4005=Drum Instrument Delay Send Level #37 4006=Drum Instrument Delay Send Level #38 4007=Drum Instrument Delay Send Level #39 4008=Drum Instrument Delay Send Level #40 4009=Drum Instrument Delay Send Level #41 4010=Drum Instrument Delay Send Level #42 4011=Drum Instrument Delay Send Level #43 4012=Drum Instrument Delay Send Level #44 4013=Drum Instrument Delay Send Level #45 4014=Drum Instrument Delay Send Level #46 4015=Drum Instrument Delay Send Level #47 4016=Drum Instrument Delay Send Level #48 4017=Drum Instrument Delay Send Level #49 4018=Drum Instrument Delay Send Level #50 4019=Drum Instrument Delay Send Level #51 4020=Drum Instrument Delay Send Level #52 4021=Drum Instrument Delay Send Level #53 4022=Drum Instrument Delay Send Level #54 4023=Drum Instrument Delay Send Level #55 4024=Drum Instrument Delay Send Level #56 4025=Drum Instrument Delay Send Level #57 4026=Drum Instrument Delay Send Level #58 4027=Drum Instrument Delay Send Level #59 4028=Drum Instrument Delay Send Level #60 4029=Drum Instrument Delay Send Level #61 4030=Drum Instrument Delay Send Level #62 4031=Drum Instrument Delay Send Level #63 4032=Drum Instrument Delay Send Level #64 4033=Drum Instrument Delay Send Level #65 4034=Drum Instrument Delay Send Level #66 4035=Drum Instrument Delay Send Level #67 4036=Drum Instrument Delay Send Level #68 4037=Drum Instrument Delay Send Level #69 4038=Drum Instrument Delay Send Level #70 4039=Drum Instrument Delay Send Level #71 4040=Drum Instrument Delay Send Level #72 4041=Drum Instrument Delay Send Level #73 4042=Drum Instrument Delay Send Level #74 4043=Drum Instrument Delay Send Level #75 4044=Drum Instrument Delay Send Level #76 4045=Drum Instrument Delay Send Level #77 4046=Drum Instrument Delay Send Level #78 4047=Drum Instrument Delay Send Level #79 4048=Drum Instrument Delay Send Level #80 4049=Drum Instrument Delay Send Level #81 4050=Drum Instrument Delay Send Level #82 4051=Drum Instrument Delay Send Level #83 4052=Drum Instrument Delay Send Level #84 4053=Drum Instrument Delay Send Level #85 4054=Drum Instrument Delay Send Level #86 4055=Drum Instrument Delay Send Level #87 4056=Drum Instrument Delay Send Level #88 4057=Drum Instrument Delay Send Level #89 4058=Drum Instrument Delay Send Level #90 4059=Drum Instrument Delay Send Level #91 4060=Drum Instrument Delay Send Level #92 4061=Drum Instrument Delay Send Level #93 4062=Drum Instrument Delay Send Level #94 4063=Drum Instrument Delay Send Level #95 4064=Drum Instrument Delay Send Level #96 4065=Drum Instrument Delay Send Level #97 4066=Drum Instrument Delay Send Level #98 4067=Drum Instrument Delay Send Level #99 4068=Drum Instrument Delay Send Level #100 4069=Drum Instrument Delay Send Level #101 4070=Drum Instrument Delay Send Level #102 4071=Drum Instrument Delay Send Level #103 4072=Drum Instrument Delay Send Level #104 4073=Drum Instrument Delay Send Level #105 4074=Drum Instrument Delay Send Level #106 4075=Drum Instrument Delay Send Level #107 4076=Drum Instrument Delay Send Level #108 4077=Drum Instrument Delay Send Level #109 4078=Drum Instrument Delay Send Level #110 4079=Drum Instrument Delay Send Level #111 4080=Drum Instrument Delay Send Level #112 4081=Drum Instrument Delay Send Level #113 4082=Drum Instrument Delay Send Level #114 4083=Drum Instrument Delay Send Level #115 4084=Drum Instrument Delay Send Level #116 4085=Drum Instrument Delay Send Level #117 4086=Drum Instrument Delay Send Level #118 4087=Drum Instrument Delay Send Level #119 4088=Drum Instrument Delay Send Level #120 4089=Drum Instrument Delay Send Level #121 4090=Drum Instrument Delay Send Level #122 4091=Drum Instrument Delay Send Level #123 4092=Drum Instrument Delay Send Level #124 4093=Drum Instrument Delay Send Level #125 4094=Drum Instrument Delay Send Level #126 4095=Drum Instrument Delay Send Level #127 ; ---------------------------------------------------------------------- .Instrument Definitions [General MIDI] Patch[*]=General MIDI Control=Standard [General MIDI Drums] Control=Standard Patch[*]=GM Drumsets Key[*,*]=General MIDI Drums Drum[*,*]=1 [Roland GS] Control=Roland GS Controllers NRPN=Roland GS NRPN Patch[0]=Roland GS Capital Tones Patch[128]=Roland GS Var #01 Patch[256]=Roland GS Var #02 Patch[384]=Roland GS Var #03 Patch[512]=Roland GS Var #04 Patch[640]=Roland GS Var #05 Patch[768]=Roland GS Var #06 Patch[896]=Roland GS Var #07 Patch[1024]=Roland GS Var #08 Patch[1152]=Roland GS Var #09 Patch[2048]=Roland GS Var #16 Patch[3072]=Roland GS Var #24 Patch[4096]=Roland GS Var #32 [Roland GS Drums] BankSelMethod=1 Control=Roland GS Controllers NRPN=Roland GS NRPN Patch[0]=Roland GS Drumsets Key[*,*]=0..127 Key[0,0]=Roland GS Standard Set Key[0,8]=Roland GS Room Set Key[0,16]=Roland GS Power Set Key[0,24]=Roland GS Electronic Set Key[0,25]=Roland GS TR-808 Set Key[0,32]=Roland GS Jazz Set Key[0,40]=Roland GS Brush Set Key[0,48]=Roland GS Orchestra Set Key[0,56]=Roland GS SFX Set Drum[*,*]=1 [Yamaha XG] Control=Yamaha XG Controllers Patch[0]=XG Bank 0 Patch[1]=XG Bank 1 (KSP) Patch[3]=XG Bank 3 (Stereo) Patch[6]=XG Bank 6 (Single) Patch[8]=XG Bank 8 (Slow) Patch[12]=XG Bank 12 (Fast Decay) Patch[14]=XG Bank 14 (Double Attack) Patch[16]=XG Bank 16 (Bright) Patch[17]=XG Bank 17 Patch[18]=XG Bank 18 (Dark) Patch[19]=XG Bank 19 Patch[20]=XG Bank 20 (Rsonant) Patch[24]=XG Bank 24 (Attack) Patch[25]=XG Bank 25 (Release) Patch[27]=XG Bank 27 (Rezo Sweep) Patch[28]=XG Bank 28 (Muted) Patch[32]=XG Bank 32 (Detune 1) Patch[33]=XG Bank 33 (Detune 2) Patch[34]=XG Bank 34 (Detune 3) Patch[35]=XG Bank 35 (Octave 1) Patch[36]=XG Bank 36 (Octave 2) Patch[37]=XG Bank 37 (5th 1) Patch[38]=XG Bank 38 (5th 2) Patch[39]=XG Bank 39 (Bend) Patch[40]=XG Bank 40 (Tutti) Patch[41]=XG Bank 41 Patch[42]=XG Bank 42 Patch[43]=XG Bank 43 (Velo-Switch) Patch[45]=XG Bank 45 (Velo-Xfade) Patch[64]=XG Bank 64 (other wave) Patch[65]=XG Bank 65 Patch[66]=XG Bank 66 Patch[67]=XG Bank 67 Patch[68]=XG Bank 68 Patch[69]=XG Bank 69 Patch[70]=XG Bank 70 Patch[71]=XG Bank 71 Patch[72]=XG Bank 72 Patch[96]=XG Bank 96 Patch[97]=XG Bank 97 Patch[98]=XG Bank 98 Patch[99]=XG Bank 99 Patch[100]=XG Bank 100 Patch[101]=XG Bank 101 Patch[896]=XG Set channel to rhythm part Patch[8192]=XG SFX Bank Patch[16128]=XG SFX Kits Patch[16256]=XG Drum Kits Key[16128,0]=XG SFX 1 Key[16256,0]=XG Standard Kit Key[16128,1]=XG SFX 2 Key[16256,1]=XG Standard2 Kit Key[16256,8]=XG Room Kit Key[16256,16]=XG Rock Kit Key[16256,24]=XG Electro Kit Key[16256,25]=XG Analog Kit Key[16256,32]=XG Jazz Kit Key[16256,40]=XG Brush Kit Key[16256,48]=XG Classic Kit Drum[16256,*]=1 [Yamaha XG Drums] Control=Yamaha XG Controllers Patch[896]=XG Set channel to rhythm part Patch[16128]=XG SFX Kits Patch[16256]=XG Drum Kits Patch[*]=No Drums Key[16128,0]=XG SFX 1 Key[16256,0]=XG Standard Kit Key[*,0]=XG Standard Kit Key[16128,1]=XG SFX 2 Key[16256,1]=XG Standard2 Kit Key[*,1]=XG Standard2 Kit Key[16256,8]=XG Room Kit Key[*,8]=XG Room Kit Key[16256,16]=XG Rock Kit Key[*,16]=XG Rock Kit Key[16256,24]=XG Electro Kit Key[*,24]=XG Electro Kit Key[16256,25]=XG Analog Kit Key[*,25]=XG Analog Kit Key[16256,32]=XG Jazz Kit Key[*,32]=XG Jazz Kit Key[16256,40]=XG Brush Kit Key[*,40]=XG Brush Kit Key[16256,48]=XG Classic Kit Key[*,48]=XG Classic Kit Drum[*,*]=1 Drum[*,0]=1 Drum[*,1]=1 Drum[*,8]=1 vmpk-0.4.0/data/help_tr.html0000644000175000001440000000053111572642326014763 0ustar pedrousers VMPK. Sanal MIDI Piyano Klavyesi

    Sanal MIDI Piyano Klavyesi

    help.html vmpk-0.4.0/data/azerty.xml0000644000175000001440000000367311572642326014512 0ustar pedrousers vmpk-0.4.0/COPYING0000644000175000001440000010451311572642326012567 0ustar pedrousers GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . vmpk-0.4.0/updateqm.pri0000644000175000001440000000073211572642326014066 0ustar pedrousers# update translations isEmpty(QMAKE_LRELEASE) { win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } updateqm.input = TRANSLATIONS updateqm.output = $$OUT_PWD/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$OUT_PWD/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm vmpk-0.4.0/TODO0000644000175000001440000000215711572642326012225 0ustar pedrousers* Pending features. http://sourceforge.net/tracker/?func=browse&group_id=236429&atid=1100310 2789350 add support for five row chromatic accordions 2488019 Split channels 2488015 Split note point 2445772 Arpeggiator 2230850 Chord generation 2209711 Support both upper & lower case letters 2142327 Play MIDI files * Implemented features MIDI CONTROLLERS, PROGRAMS 2106035 controller value state remembered when changing from one controller to another one. 2106031 settings persistence of controller values and bank/programs. 2790324 extra controllers and on/off controllers MIDI CONNECTIONS 2106023 MIDI thru: optionally send the received events to the output port. 2106026 store connection names instead of numbers in the settings PRESENTATION 2106015 translation (Qt Linguist) support, and also Spanish translation 2106021 let the user to choose a custom highligh color for the pressed keys 2779744 keyboard window: always on top 2488065 online help 2107732 better mouse handling 2109421 display key names 2209692 Transpose 2106022 better looking keys (realistic 3D, maybe SVG graphics) 2848623 Raw keyboard support vmpk-0.4.0/CMakeLists.txt0000644000175000001440000002604711572642326014301 0ustar pedrousers# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2011 Pedro Lopez-Cabanillas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; If not, see . project (VMPK) cmake_minimum_required (VERSION 2.8) if (${CMAKE_SYSTEM} MATCHES "Linux") set (MIDI_DRIVER_INIT "ALSA") set (DBUS_INIT ON) elseif (${CMAKE_SYSTEM} MATCHES "IRIX") set (MIDI_DRIVER_INIT "IRIX") set (DBUS_INIT OFF) elseif (APPLE) set (MIDI_DRIVER_INIT "COREMIDI") set (DBUS_INIT OFF) elseif (WIN32) set (MIDI_DRIVER_INIT "WINMM") set (DBUS_INIT OFF) else () set (MIDI_DRIVER_INIT "NET") set (DBUS_INIT OFF) endif () set (PROGRAM_NAME_INIT "vmpk") set (RTMIDI_DRIVER ${MIDI_DRIVER_INIT} CACHE STRING "RtMIDI driver: ALSA, JACK, COREMIDI, IRIX, WINMM, NET") set (PROGRAM_NAME ${PROGRAM_NAME_INIT} CACHE STRING "Executable program name") option (ENABLE_DBUS "Enable experimental VMPK DBus interface" ${DBUS_INIT}) # Show full commands and messages. # set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL) # If relative paths break the link scripts, set it OFF # set(CMAKE_USE_RELATIVE_PATHS OFF) # Assorted settings set (CMAKE_COLOR_MAKEFILE ON) set (CMAKE_INCLUDE_CURRENT_DIR TRUE) set (CMAKE_SKIP_RULE_DEPENDENCY FALSE) set (CMAKE_CXX_FLAGS_DEBUG "-g -DQT_DEBUG -DDEBUG -D__RTMIDI_DEBUG__") set (CMAKE_CXX_FLAGS_RELEASE "-O2 -DQT_NO_DEBUG -DNDEBUG") add_definitions (-DRAWKBD_SUPPORT) # Additional CMake modules for 3rd party library checks reside here set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_admin") # VMPK version string set (VERSION_MAJOR "0") set (VERSION_MINOR "4") set (VERSION_PATCH "0") set (VERSION_SUFFIX "") set (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}) message (STATUS "${PROGRAM_NAME} ${VERSION} install prefix: ${CMAKE_INSTALL_PREFIX} RtMIDI driver: ${RTMIDI_DRIVER}") # User options message (STATUS "Build configuration: ${CMAKE_BUILD_TYPE}") # Check for Qt set (QT_MIN_VERSION "4.6.0") find_package (Qt4 REQUIRED) if (QT4_FOUND) message (STATUS "Found Qt4.${QT_EDITION} version = ${QTVERSION}") else () message (FATAL_ERROR "Qt4 >= 4.6 not found") endif () set (QT_USE_QTXML TRUE) set (QT_USE_QTSVG TRUE) if (ENABLE_DBUS) set (QT_USE_QTDBUS TRUE) add_definitions (-DENABLE_DBUS) endif () include (${QT_USE_FILE}) include_directories (${QT_INCLUDES}) link_directories (${QT_LIBRARY_DIR}) link_libraries (${QT_LIBRARIES}) add_definitions (-DQT_STRICT_ITERATORS) if (UNIX AND NOT APPLE) # Check for PKG-CONFIG find_package (PkgConfig REQUIRED) if (PKG_CONFIG_FOUND) message (STATUS "Program pkg-config found (${PKG_CONFIG_EXECUTABLE})") else () message (FATAL_ERROR "Program pkg-config not found") endif () # Check for libX11 find_package (X11 REQUIRED) include_directories (${X11_X11_INCLUDE_PATH}) link_libraries (${X11_X11_LIB}) endif () if (RTMIDI_DRIVER STREQUAL "JACK") # Check Jack set (HAVE_JACK FALSE) PKG_CHECK_MODULES (JACK REQUIRED jack) if (JACK_FOUND) set (HAVE_JACK TRUE) add_definitions (-DHAVE_JACK) set (JACK_LIBS ${JACK_LIBRARIES}) list (APPEND JACK_LIB_DIR ${JACK_LIBRARY_DIRS} ${JACK_LIBDIR}) list (APPEND JACK_INC_DIR ${JACK_INCLUDE_DIRS} ${JACK_INCLUDEDIR}) link_directories (${JACK_LIB_DIR}) include_directories (${JACK_INC_DIR}) add_definitions (-D__LINUX_JACK__) link_libraries (${JACK_LIBS}) else () message (FATAL_ERROR "Please install Jack development libs and headers.") endif () endif () if (RTMIDI_DRIVER STREQUAL "ALSA") find_package (Threads REQUIRED) # Check ALSA 1.0 set (HAVE_ALSA FALSE) PKG_CHECK_MODULES (ALSA REQUIRED alsa>=1.0) if (ALSA_FOUND) set (HAVE_ALSA TRUE) add_definitions (-DHAVE_ALSA) set (ALSA_LIBS ${ALSA_LIBRARIES}) list (APPEND ALSA_LIB_DIR ${ALSA_LIBRARY_DIRS} ${ALSA_LIBDIR}) list (APPEND ALSA_INC_DIR ${ALSA_INCLUDE_DIRS} ${ALSA_INCLUDEDIR}) link_directories (${ALSA_LIB_DIR}) include_directories (${ALSA_INC_DIR}) add_definitions (-D__LINUX_ALSASEQ__) add_definitions (-DAVOID_TIMESTAMPING) link_libraries (${ALSA_LIBS} ${CMAKE_THREAD_LIBS_INIT}) else () message(FATAL_ERROR "Please install ALSA development libs and headers.") endif () endif () if (RTMIDI_DRIVER STREQUAL "COREMIDI") add_definitions (-D__MACOSX_CORE__) link_libraries ("-framework CoreMidi -framework CoreAudio -framework CoreFoundation -framework Carbon") endif () if (RTMIDI_DRIVER STREQUAL "IRIX") find_package (Threads REQUIRED) add_definitions (-D__IRIX_MD__) link_libraries (audio ${CMAKE_THREAD_LIBS_INIT}) endif () if (RTMIDI_DRIVER STREQUAL "WINMM") find_package (WINDRES REQUIRED) add_definitions (-D__WINDOWS_MM__) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mwindows") link_libraries (winmm) endif () if (RTMIDI_DRIVER STREQUAL "NET") add_definitions (-DNETWORK_MIDI) endif() add_subdirectory (src) add_subdirectory (translations) configure_file (vmpk.spec.in vmpk.spec IMMEDIATE @ONLY) # uninstall custom target configure_file ( "${CMAKE_SOURCE_DIR}/cmake_admin/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target ( uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") set (vmpk_DATA_FILES data/azerty.xml data/vkeybd-default.xml data/it-qwerty.xml data/german.xml data/gmgsxg.ins data/spanish.xml data/pc102x11.xml data/pc102mac.xml data/pc102win.xml data/txt2ins.awk data/hm.html data/hm_es.html data/help.html data/help_de.html data/help_es.html data/help_fr.html data/help_nl.html data/help_ru.html ) if (UNIX) add_custom_target ( distclean COMMAND rm -rf build/* WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_dependencies (distclean clean) add_custom_target (tarball COMMAND mkdir -p vmpk-${VERSION}/translations/ COMMAND cp -r cmake_admin vmpk-${VERSION} COMMAND cp -r data vmpk-${VERSION} COMMAND cp -r src vmpk-${VERSION} COMMAND cp -r man vmpk-${VERSION} COMMAND cp -r dbus vmpk-${VERSION} COMMAND cp translations/vmpk_{cs,de,es,fr,nl,ru,sv,zh_CN}.ts vmpk-${VERSION}/translations/ COMMAND cp translations/CMakeLists.txt vmpk-${VERSION}/translations/ COMMAND cp AUTHORS ChangeLog CMakeLists.txt COPYING gpl.rtf NEWS README *.nsi TODO vmpk.desktop vmpk.pro updateqm.pri vmpk.spec.in qt.conf vmpk-${VERSION} COMMAND tar -cj --exclude=.* -f vmpk-${VERSION}.tar.bz2 vmpk-${VERSION} COMMAND tar -cz --exclude=.* -f vmpk-${VERSION}.tar.gz vmpk-${VERSION} COMMAND rm -rf vmpk-${VERSION} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) endif () if (UNIX AND NOT APPLE) add_subdirectory (man) install (FILES ${vmpk_DATA_FILES} DESTINATION share/vmpk ) install (FILES data/vmpk_16x16.png DESTINATION share/icons/hicolor/16x16/apps RENAME vmpk.png) install (FILES data/vmpk_32x32.png DESTINATION share/icons/hicolor/32x32/apps RENAME vmpk.png) install (FILES data/vmpk_48x48.png DESTINATION share/icons/hicolor/48x48/apps RENAME vmpk.png) install (FILES data/vmpk_64x64.png DESTINATION share/icons/hicolor/64x64/apps RENAME vmpk.png) install (FILES data/vmpk_128x128.png DESTINATION share/icons/hicolor/128x128/apps RENAME vmpk.png) install (FILES data/vmpk.svgz DESTINATION share/icons/hicolor/scalable/apps ) install (FILES vmpk.desktop DESTINATION share/applications ) endif () if (WIN32) include (InstallRequiredSystemLibraries) set (QTLIBLIST QtCore QtGui QtXml QtSvg ) get_filename_component (QT_DLL_PATH_tmp ${QT_QMAKE_EXECUTABLE} PATH) foreach (qtlib ${QTLIBLIST}) install (FILES ${QT_DLL_PATH_tmp}/${qtlib}4.dll DESTINATION .) endforeach (qtlib) if (MINGW) install (FILES ${QT_DLL_PATH_tmp}/mingwm10.dll ${QT_DLL_PATH_tmp}/libgcc_s_dw2-1.dll DESTINATION .) endif () install (FILES ${vmpk_DATA_FILES} DESTINATION .) endif () if (APPLE) set (target "vmpk") configure_file ("${CMAKE_SOURCE_DIR}/cmake_admin/CompleteBundle.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/build/CompleteBundle.cmake" @ONLY IMMEDIATE) configure_file ("${CMAKE_SOURCE_DIR}/cmake_admin/CreateBundle.sh.in" "${CMAKE_CURRENT_BINARY_DIR}/build/CreateBundle.sh" @ONLY IMMEDIATE) install (SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/build/CompleteBundle.cmake") endif () # CPack support include (InstallRequiredSystemLibraries) set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Virtual MIDI Piano Keyboard") set (CPACK_PACKAGE_VENDOR "vmpk.sourceforge.net") set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README") set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/gpl.rtf") set (CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) set (CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) set (CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH}) set (CPACK_PACKAGE_INSTALL_DIRECTORY "vmpk") set (CPACK_PACKAGE_EXECUTABLES "vmpk" "Virtual MIDI Piano Keyboard") # source packages set (CPACK_SOURCE_GENERATOR TGZ;TBZ2;ZIP) set (CPACK_SOURCE_IGNORE_FILES "/.svn/;/build/;/share/;~$;.cproject;.project;.user;${CPACK_SOURCE_IGNORE_FILES}") set (CPACK_SOURCE_PACKAGE_FILE_NAME "vmpk-${VERSION}") set (CPACK_SOURCE_STRIP_FILES OFF) # linux binary packages if (${CMAKE_SYSTEM} MATCHES "Linux") set (CPACK_GENERATOR TGZ;TBZ2) set (CPACK_PACKAGE_NAME "vmpk") math (EXPR PWORD_SIZE "${CMAKE_SIZEOF_VOID_P}*8") set (CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-x86_${PWORD_SIZE}) # set (CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) # set (CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) set (CPACK_STRIP_FILES ON) endif () # Windows NSIS setup package #if (WIN32) # set (CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/src/vmpk.ico") # set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\MyExecutable.exe") # set (CPACK_NSIS_DISPLAY_NAME "Virtual MIDI Piano Keyboard") # set (CPACK_NSIS_HELP_LINK "http://vmpk.sourceforge.net") # set (CPACK_NSIS_URL_INFO_ABOUT "http://vmpk.sourceforge.net") # set (CPACK_NSIS_CONTACT "plcl@users.sourceforge.net") # set (CPACK_NSIS_MODIFY_PATH OFF) #endif () # Mac OSX bundle #if (APPLE) #endif () include (CPack) vmpk-0.4.0/cmake_admin/0000755000175000001440000000000011572642326013760 5ustar pedrousersvmpk-0.4.0/cmake_admin/CompleteBundle.cmake.in0000644000175000001440000000473111572642326020276 0ustar pedrousers#-- Need this for link line stuff? if(COMMAND cmake_policy) cmake_policy(SET CMP0009 NEW) endif(COMMAND cmake_policy) # gp_item_default_embedded_path item default_embedded_path_var # # Return the path that others should refer to the item by when the item # is embedded inside a bundle. # # Override on a per-project basis by providing a project-specific # gp_item_default_embedded_path_override function. # function(gp_item_default_embedded_path_override item default_embedded_path_var) # # The assumption here is that all executables in the bundle will be # in same-level-directories inside the bundle. The parent directory # of an executable inside the bundle should be MacOS or a sibling of # MacOS and all embedded paths returned from here will begin with # "@loader_path/../" and will work from all executables in all # such same-level-directories inside the bundle. # # By default, embed things right next to the main bundle executable: # set (install_name_prefix "@executable_path") # ------------------------------------------------------------------- # If your application uses plugins then you should consider using the following # instead but will limit your deployment to OS X 10.4. There is also a patch # needed for CMake that as of Sept 30, 2008 has NOT been applied to CMake. # set (install_name_prefix "@loader_path") set(path "${install_name_prefix}/../../Contents/MacOS") set(overridden 0) # Embed .dylibs in the Libraries Directory # if(item MATCHES "\\.dylib$") set(path "${install_name_prefix}/../Libraries") set(overridden 1) endif(item MATCHES "\\.dylib$") # Embed .so files in the Plugins directory # if(item MATCHES "\\.so$") set(path "${install_name_prefix}/../Plugins") set(overridden 1) endif(item MATCHES "\\.so$") # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS): # if(NOT overridden) if(item MATCHES "[^/]+\\.framework/") set(path "${install_name_prefix}/../Frameworks") set(overridden 1) endif(item MATCHES "[^/]+\\.framework/") endif(NOT overridden) set(${default_embedded_path_var} "${path}" PARENT_SCOPE) endfunction(gp_item_default_embedded_path_override) # -- Copy the App bundle to the installation location first EXECUTE_PROCESS( COMMAND "${CMAKE_CURRENT_BINARY_DIR}/build/CreateBundle.sh" ) # -- Run the BundleUtilities cmake code include(BundleUtilities) fixup_bundle("@CMAKE_INSTALL_PREFIX@/@target@.app" "${PluginList}" "Plugins") vmpk-0.4.0/cmake_admin/CreateManpages.cmake0000644000175000001440000000277011572642326017647 0ustar pedrousers# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2011 Pedro Lopez-Cabanillas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; If not, see . MACRO(CREATE_MANPAGES) SET(outfiles) FOREACH (it ${ARGN}) GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfile}.1) SET(outfiles ${outfiles} ${outfile}) ADD_CUSTOM_COMMAND( OUTPUT ${outfile} COMMAND ${XSLTPROC_EXECUTABLE} --nonet --xinclude --xincludestyle --output ${outfile} http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl ${infile} DEPENDS ${infile}) ENDFOREACH (it) ADD_CUSTOM_TARGET(manpages ALL DEPENDS ${outfiles}) INSTALL ( FILES ${outfiles} DESTINATION share/man/man1 ) ENDMACRO(CREATE_MANPAGES) vmpk-0.4.0/cmake_admin/cmake_uninstall.cmake.in0000644000175000001440000000155511572642326020546 0ustar pedrousersIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"${file}\"") IF(EXISTS "${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF("${rm_retval}" STREQUAL 0) ELSE("${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") ENDIF("${rm_retval}" STREQUAL 0) ELSE(EXISTS "${file}") MESSAGE(STATUS "File \"${file}\" does not exist.") ENDIF(EXISTS "${file}") ENDFOREACH(file) vmpk-0.4.0/cmake_admin/CreateBundle.sh.in0000744000175000001440000000227011572642326017260 0ustar pedrousers#!/bin/sh # Are we using Xcode to compile. If we are then the CMake variable # XCODE will be '1' otherwise it will be blank Xcode="@XCODE@x" InstallPrefix="@CMAKE_INSTALL_PREFIX@" OSX_App_Name="@target@.app" if [[ $Xcode == "1x" ]]; then OSX_App="@CMAKE_CURRENT_BINARY_DIR@/build/$BUILD_STYLE/$OSX_App_Name" else OSX_App="@CMAKE_CURRENT_BINARY_DIR@/build/$OSX_App_Name" fi Translations="@CMAKE_CURRENT_BINARY_DIR@/build/translations/*.qm" # Remove the previous @target@ app package so we start with a clean bundle echo "Removing Previous $OSX_App_Name bundle at $InstallPrefix/" rm -rf "$InstallPrefix/$OSX_App_Name" # copy the @target@.app bundle to the installation location echo "Copying $OSX_App_Name from the build tree to $InstallPrefix/" cp -Rp "$OSX_App" "$InstallPrefix/" OSX_App="@CMAKE_INSTALL_PREFIX@/$OSX_App_Name" ContentsDir="$OSX_App/Contents" SupportDir="$OSX_App/Contents/Support" LibrariesDir="$OSX_App/Contents/Libraries" FrameworksDir="$OSX_App/Contents/Frameworks" PluginsDir="$OSX_App/Contents/Plugins" ResourcesDir="$OSX_App/Contents/Resources" # create directories in the @target@.app bundle #mkdir -p "$SupportDir" #mkdir -p "$FrameworksDir" cp $Translations $ResourcesDir vmpk-0.4.0/cmake_admin/FindWindres.cmake0000644000175000001440000000352511572642326017203 0ustar pedrousers# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2011 Pedro Lopez-Cabanillas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; If not, see . IF(WINDRES_EXECUTABLE) SET(WINDRES_FOUND TRUE) ELSE(WINDRES_EXECUTABLE) FIND_PROGRAM(WINDRES_EXECUTABLE NAMES windres mingw32-windres i686-mingw32-windres) IF(WINDRES_EXECUTABLE) SET(WINDRES_FOUND TRUE) ELSE(WINDRES_EXECUTABLE) IF(NOT WINDRES_FIND_QUIETLY) IF(WINDRES_FIND_REQUIRED) MESSAGE(FATAL_ERROR "windres program couldn't be found") ENDIF(WINDRES_FIND_REQUIRED) ENDIF(NOT WINDRES_FIND_QUIETLY) ENDIF(WINDRES_EXECUTABLE) ENDIF (WINDRES_EXECUTABLE) # ADD_WINDRES_OBJS(outfiles inputfile ... ) MACRO(ADD_WINDRES_OBJS outfiles) FOREACH (it ${ARGN}) GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfile}.obj) ADD_CUSTOM_COMMAND(OUTPUT ${outfile} COMMAND ${WINDRES_EXECUTABLE} ARGS -I${CMAKE_CURRENT_SOURCE_DIR} -i ${infile} -o ${outfile} MAIN_DEPENDENCY ${infile}) SET(${outfiles} ${${outfiles}} ${outfile}) ENDFOREACH (it) ENDMACRO(ADD_WINDRES_OBJS) vmpk-0.4.0/ChangeLog0000644000175000001440000001674211572642326013314 0ustar pedrousers2011-05-01 * Symbian port started 2011-04-23 * new Network MIDI driver, based on Qmidinet (http://qmidinet.sf.net) 2011-04-22 * Merged RtMidi 1.0.14 2011-04-17 * Jack: fixed RtMidiOut destructor and closePort(). Patch by Alexander Svetalkin * Build system updated to cmake-2.8, new options RTMIDI_DRIVER, PROGRAM_NAME 2011-04-08 * Merged RtMidi 1.0.13 * build system: find jack 2011-04-03 * SVG icon: added a thin blurred background 2011-03-12 * Requires Qt >= 4.6.x 2011-03-08 * Touch events implementation 2011-03-01 * Merged RtMidi 1.0.12 * build system: find library libX11 explicitly 2010-12-24 * Fixed crash when changing the octave base while channel is 10. 2010-11-20 * French translation (web site and help page) thanks to Nicolas Froment 2010-10-14 * Swedish translation, thanks to Magnus Johansson * Shortcuts are now untranslatable * Preliminary CPack support 2010-10-05 * Dutch translation, thanks to Wouter Reckman 2010-10-04 * release 0.3.3 2010-10-01 * Buildsystem updates * exclude unmaintained translations from builds and distribution 2010-09-29 * Set an application icon for Linux * Display the tooltips over the knobs and sliders instead of the mouse pos. * Language variants support fix * PianoScene fix: refactored allowing to trigger hidden keys 2010-09-28 * Translation updates 2010-09-26 * Process incoming controller events: all sounds off, all notes off, reset all controllers. 2010-09-25 * About translation dialog * Dynamic language change without restart 2010-09-24 * New option: Translate MIDI velocity into key pressed color tint 2010-09-23 * Language menu to select another language * (Linux) translation files moved to $prefix/share/vmpk/locale 2010-09-22 * Tool shortcuts 2010-09-21 * Shortcuts editor dialog (from Qtractor, by Rui Nuno Capela) 2010-06-18 * release 0.3.2 2010-06-12 * basic d-bus service 2010-06-09 * Chinese language translation by Rui Fan 2010-04-13 * German translation of manual added, edited document provided by Philip Edelmann 2010-03-13 * Larger shapes for switch extra controls, when using the custom qstyle. 2010-02-23 * Fixed German note names: English note B as H in German, and English B♭ as B in German * Install a compressed SVGZ icon instead of the plain one * Note for Linux users, regarding docbook XSLT and man page. 2010-02-20 * RtMIDI updated to 1.0.11 * Compile using QT_STRICT_ITERATORS 2009-12-15 * Explicit link against -framework Carbon in Mac OSX * Release 0.3.1 2009-12-14 * Czech translation, by Pavel Fric 2009-12-12 * French and German translations updated 2009-12-10 * show drums channel note names 2009-12-09 * per channel state for banks, instruments, controllers * drums instrument 2009-12-08 * drums channel, new setting in preferences dialog 2009-12-07 * extra controls: new button types 2009-12-06 * moved the "show note names" option from preferences dialog to view menu 2009-11-28 * French translation, by Frank Kober * updated German translation 2009-11-09 * Russian translation, by Serguey G Basalaev 2009-09-27 * Release 0.3.0 2009-09-25 * Release candidate 3 * Fix the extra controllers toolbar 2009-09-24 * Release candidate 2 * Mac OS X polishing and consistency fixes 2009-09-21 * Release candidate 1 * build system updates * fixed interaction for extra controllers 2009-09-16 * merged vpiano 0.8 widget * implemented RFE #2848623: Raw keyboard support, raw Keyboard Map editor * implemented RFE #2790324 extra controls tool bar: new extra controllers (knobs and on/off buttons with customizable labels) which can be assigned to arbitrary MIDI controllers. * implemented RFE #2106022 better looking keys using SVG graphics. 2009-08-31 * Fix RtMidiOut port type flags 2009-08-25 * German translation, by Andreas Steinel 2009-08-03 * release 0.2.6 2009-08-02 * merged vpiano 0.7 widget * implemented RFE #2109421: new preferences option: show note names * implemented RFE #2209692: new toolbar control: transpose in semitones 2009-07-28 * merged RtMIDI 1.0.10 2009-06-08 * check for Qt version >= 4.4.0 * updated documentation 2009-06-07 * fixed release/grab keyboard and SoundFont import dialog 2009-06-07 * private development files excluded from the tarball * don't install documents, leave it to packagers * removed shebang from the txt2ins.awk script * man page, by Mehdi Dogguy. Thanks! 2009-05-31 * release 0.2.5 2009-05-30 * Spanish help file translated. 2009-05-28 * Bender returns to zero when released 2009-05-26 * Dialogs: help "WhatIsThis?" strings, layouts * updated spanish translation 2009-05-25 * Import Sound Font Instruments 2009-05-12 * fix for bug# 2790316 - startup crash in OSX when no MIDI port present 2009-04-23 * implemented RFE# 2779744 - keyboard window: always on top * MIDI In always enabled on Linux and Mac 2009-04-05 * release 0.2.4 2009-02-08 * merged RtMIDI 1.0.8 * overhauled preferences: removed channels, velocity, base octave 2009-01-18 * implemented RFE #2488065 - online help * applied patch #2490414 from Serdar Soytetir: Turkish translation * build app bundle in Mac OSX 2008-12-03 * version string = 0.2.4cvs * better about dialog * thru function: Send every incoming event to the output port, do not modify incoming channels. Process inside MIDI callback for better performance. 2008-11-30 0.2.3 * fix for bug #2364787 Rosegarden renders vmpk input unusable * optimization for Linux: do not create an ALSA queue 2008-10-19 0.2.2 * true fix for RtMIDI bug #2158014 Crash in windows * Spanish translation updated 2008-10-14 * fix for bug: #2164586 segmentation fault at startup 2008-10-13 * version string changed 2008-10-12 * check for IO errors (keyboard map and instruments files) * fix for bug: #2162189 No warning message despite keymap not saved 2008-10-11 0.2.1 * fix for bug #2143187 Documentation needed 2008-10-10 * workaround for bug #2158014 Crash in windows 2008-10-03 * fix for bug: #2142335 Keys played beyond the upper MIDI note limits * fix for bug: #2142321 the reset all button 2008-09-28 * grab keyboard: workaround for broken WMs, now this feature is optional * fix generic Qt translations 2008-09-26 0.2.0 * implemented RFE: #2106023 MIDI thru 2008-09-25 * implemented RFE: #2106026 store connection names in settings 2008-09-21 * fix for bug: #2116713 - QJackCtl input port is shown for connections * implemented RFE: #2106035 controllers state remembered * implemented RFE: #2106031 settings persistence: controllers/bank/program 2008-09-14 * implemented RFE: #2106015 translation (Qt Linguist) support 2008-09-13 * implemented RFE: #2107732 mouse handling * implemented RFE: #2106021 let the user to choose a custom highligh color * reorganisations 2008-09-11 * new icon, by Theresa Knott * fix for bug: #2105246 Channel numbers starting from 1 instead of 0 * better About dialog * toolbars: workaround for strange Qt4.4 behavior when restoring the main window state. 2008-09-05 0.1.1 * bugfixes and optimizations 2008-08-31 0.1.0 * first public release vmpk-0.4.0/AUTHORS0000644000175000001440000000437611572642326012612 0ustar pedrousersPedro Lopez-Cabanillas Translators: Serdar Soytetir - Turkish translation translations/vmpk_tr.ts Andreas Steinel - German translation translations/vmpk_de.ts Pedro Lopez-Cabanillas - Spanish translation translations/vmpk_es.ts data/help_es.html Serguey G Basalaev - Russian translation translations/vmpk_ru.ts data/help_ru.html Frank Kober - French and German translations translations/vmpk_fr.ts translations/vmpk_de.ts data/help_de.html Pavel Fric - Czech translation translations/vmpk_cs.ts Philip Edelmann - German translation data/help_de.html Rui Fan - Chinese translation translations/vmpk_zh_CN.ts Wouter Reckman - Dutch translation translations/vmpk_nl.ts data/help_nl.html Magnus Johansson - Swedish translation translations/vmpk_sv.ts Nicolas Froment - French translation data/help_fr.html Other copyright owners: Gary P. Scavone RtMIDI classes src/RtError.h src/RtMidi.h src/RtMidi.cpp Rui Nuno Capela Instrument definition data classes, Knob widget, Shortcuts Editor Dialog src/instrument.h src/instrument.cpp src/knob.h src/knob.cpp src/shortcutdialog.h src/shortcutdialog.ui src/shortcutdialog.cpp Chris Cannam, Pedro Lopez-Cabanillas, Queen Mary University of London src/classicstyle.h src/classicstyle.cpp Theresa Knott Artwork (www.openclipart.org) data/TheresaKnott_piano.svg data/vmpk_16x16.png data/vmpk_32x32.png data/vmpk_48x48.png data/vmpk_64x64.png data/vmpk.icns src/vmpk.ico Mehdi Dogguy Man page, Debian packaging man/vmpk.xml man/vmpk.1 David Vignoni Oxygen Icons. See: http://www.oxygen-icons.org Nuno Pinheiro licensed under the GNU LGPLv3 Kenneth Wimer http://www.gnu.org/copyleft/lesser.html data/list-add.svg data/list-remove.svg Benji Park Artwork (www.openclipart.org) data/led_green.svg data/led_grey.svg vmpk-0.4.0/NEWS0000644000175000001440000000042111572642326012224 0ustar pedrousersThere are news feeds available for this project's releases: http://sourceforge.net/export/rss2_projfiles.php?group_id=236429 http://freshmeat.net/projects/vmpk/releases.atom Detailed development activities: http://sourceforge.net/export/rss2_keepsake.php?group_id=236429 vmpk-0.4.0/dbus/0000755000175000001440000000000011572642326012465 5ustar pedrousersvmpk-0.4.0/dbus/dbus-client.py0000744000175000001440000000123511572642326015252 0ustar pedrousers#!/usr/bin/env python import sys import time import dbus if __name__ == '__main__': bus = dbus.SessionBus() try: object = bus.get_object("net.sourceforge.vmpk", "/") except dbus.DBusException: print "please, run VMPK before this program..." sys.exit(1) # interface methods interface = dbus.Interface(object, "net.sourceforge.vmpk") #interface.programchange(73); interface.programnamechange("flute"); interface.noteon(69); time.sleep(1); interface.noteoff(69); # introspection print object.Introspect(dbus_interface="org.freedesktop.DBus.Introspectable") # close vmpk interface.quit() vmpk-0.4.0/dbus/dbus-signal-receiver.py0000744000175000001440000000137011572642326017053 0ustar pedrousers#!/usr/bin/env python import sys import gobject import dbus import dbus.mainloop.glib def noteon_handler(note): print "note on %d" % note def noteoff_handler(note): print "note off %d" % note if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() try: object = bus.get_object("net.sourceforge.vmpk", "/") object.connect_to_signal("event_noteon", noteon_handler, dbus_interface="net.sourceforge.vmpk") object.connect_to_signal("event_noteoff", noteoff_handler, dbus_interface="net.sourceforge.vmpk") except dbus.DBusException: print "please, run VMPK before this program..." sys.exit(1) loop = gobject.MainLoop() loop.run() vmpk-0.4.0/dbus/bigben.sh0000744000175000001440000000322411572642326014251 0ustar pedrousers#!/bin/bash # London Tower Big Ben tune as a simple bash script # Copyright (C) 2002-2011 Pedro Lopez-Cabanillas # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . tune="60 4, 64 4, 62 4, 55 2, 60 4, 62 4, 64 4, 60 2, \ 64 4, 60 4, 62 4, 55 2, 55 4, 62 4, 64 4, 60 2," DBUSC=$(which qdbus) tempo=80 function dbus_command() { $DBUSC net.sourceforge.vmpk / $* >/dev/null 2>&1 } function playnote() { let "ms = 240000 / ($2 * $tempo)" dbus_command noteon $1 sleep $ms'e-3s' dbus_command noteoff $1 } function playtune() { echo $tune | while read -rd, note length; do playnote $note $length done } function playtime() { h=$(date +%l) while [ $h -gt 0 ]; do playnote 43 2 let "h--" done } if [ -z $DBUSC ]; then echo "qdbus (from Qt4) is required" else if [ -z $($DBUSC | grep "net.sourceforge.vmpk") ]; then echo "please run VMPK before this script" else # volume = 100 dbus_command controlchange 7 100 # instrument = bells dbus_command programchange 14 playtune sleep 2 playtime fi fi vmpk-0.4.0/dbus/README0000644000175000001440000000423711572642326013353 0ustar pedrousersVMPK D-Bus interface ==================== The D-Bus interface is available in VMPK since the release 0.3.2 (June 2010). Interface name: "net.sourceforge.vmpk" Path: "/" Window control methods: void hide(); void lower(); void move(int x, int y); void raise(); void repaint(); void resize(int width, int height); void setDisabled(bool disable); void setEnabled(bool enable); void setFocus(); void setHidden(bool hidden); void setStyleSheet(const QString &styleSheet); void setVisible(bool visible); void setWindowModified(bool modified); void setWindowTitle(const QString &title); void show(); void showFullScreen(); void showMaximized(); void showMinimized(); void showNormal(); void update(); Program methods: void quit(); void panic(); void reset_controllers(); void channel(int value); void octave(int value); void transpose(int value); void velocity(int value); void connect_in(const QString &value); void connect_out(const QString &value); void connect_thru(bool value); MIDI methods: void noteoff(int note); void noteon(int note); void polykeypress(int note, int value); void controlchange(int control, int value); void programchange(int value); void programnamechange(const QString &value); void chankeypress(int value); void pitchwheel(int value); Signals: void event_noteoff(int note); void event_noteon(int note); void event_polykeypress(int note, int value); void event_controlchange(int control, int value); void event_programchange(int value); void event_chankeypress(int value); void event_pitchwheel(int value); Examples ======== Note: you need to execute VMPK before running any of the examples. Python: dbus-client.py dbus-signal-receiver.py Bash shell script: bigben.sh BUILDING ======== CMake builds by default the D-Bus interface feature. To disable it, use this option at configuration time: $ cmake . -DENABLE_DBUS=OFF On the other hand, the Qmake build system doesn't build the D_Bus interface unless you explicitly enable it at configure time: $ qmake DEFINES+=ENABLE_DBUS vmpk-0.4.0/README0000644000175000001440000001604211572642326012413 0ustar pedrousersVirtual MIDI Piano Keyboard =========================== This program is a MIDI events generator/receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. To do so, connect the other MIDI port to the input port of VMPK. VMPK has been tested in Linux, Windows and Mac, but maybe you can build it also in SGI Irix. If you can compile and test the program in this system, please drop a mail to the author. The Virtual Keyboard by Takashi Iway (vkeybd) has been the inspiration for this one. It is a wonderful piece of software and has served us well for many years. Thanks! VMPK uses a modern GUI framework: Qt4, that gives excellent features and performance. RtMIDI provides MIDI input/output features. Both frameworks are free and platform independent, available for Linux, Windows and Mac OSX. The alphanumeric keyboard mapping can be configured from inside the program using the GUI interface, and the settings are stored in XML files. Some maps for Spanish, German and French keyboard layouts are provided, translated from the ones provided by VKeybd. Raw keyboard mappings can also be defined, translating X11, Windows or Mac keycodes to MIDI notes. VMPK can send program changes and controllers to a MIDI synth. The definitions for different standards and devices can be provided as .INS files, the same format used by QTractor and TSE3. It was developed by Cakewalk and used also in Sonar. This software is in a very early alpha stage. See the TODO file for a list of pending features. Please feel free to contact the author to ask questions, report bugs, and propose new features. See http://vmpk.sourceforge.net for more details. DOWNLOAD Latest release is available in Sourceforge: http://sourceforge.net/projects/vmpk/files REQUIREMENTS You need Qt 4.6 or newer. Install the -devel package for your system, or download the open source edition from Nokia: http://qt.nokia.com/downloads/ RtMIDI is included in the source package. It uses the ALSA sequencer in Linux, WinMM in Windows and CoreMIDI in Mac OSX, which are the native MIDI systems in all the supported platforms. http://www.music.mcgill.ca/~gary/rtmidi/ The build system is based on CMake. You can download it from: http://www.cmake.org You need also the GCC C++ compiler. http://gcc.gnu.org http://www.mingw.org Optionally, you can build a Windows setup program using NSIS. http://nsis.sourceforge.net INSTALLATION Download the sources from http://sourceforge.net/projects/vmpk/files Unpack the sources in your home directory, and change to the unpacked dir. $ cd vmpk-x.x.x You can choose between CMake and Qmake to prepare the build system, but qmake is intended only for testing and development. $ cmake . or $ ccmake . or $ qmake After that, compile the program: $ make if the program has been compiled successfully, you can install it: $ make install There are more commands available: $ make uninstall $ make clean You can get some compiler optimisation when building the program, but don't expect too much improvement. There are two ways. First, using a predefined configuration type: $ cmake . -DCMAKE_BUILD_TYPE=Release The CMake "Release" type uses the compiler flags: "-O3 -DNDEBUG". Other predefined build types are "Debug", "RelWithDebInfo", and "MinSizeRel". The second way is to choose the compiler flags yourself: $ export CXXFLAGS="-O2 -march=native -mtune=native -DNDEBUG" $ cmake . You need to find the better CXXFLAGS for your own system. If you want to install the program at some place other than the default (/usr/local) use the following CMake option: $ cmake . -DCMAKE_INSTALL_PREFIX=/usr Other optional configuration options are: * ENABLE_DBUS: activates the DBus interface, enabled on Linux by default. * RTMIDI_DRIVER: selects the RtMIDI backend. Default depends on the OS. Allowed values: ALSA, JACK, COREMIDI, IRIX, WINMM, NET * PROGRAM_NAME: selects the executable name. example: $ cmake . -DRTMIDI_DRIVER=JACK -DPROGRAM_NAME=vmpk-jack NOTES FOR LINUX USERS A man page is included in the source package, ready to be installed and used. But if you prefer to generate the man page yourself, the build system can do it if you have installed in your system the following packages: * xsltproc program. * docbook XSLT stylesheets. The package names depend on the Linux distribution. For Debian they are: xsltproc, docbook-xsl and docbook-xml. For openSUSE: libxslt, docbook_4, and docbook-xsl-stylesheets. NOTES FOR WINDOWS USERS To compile the sources in Windows, you need to download either the .bz2 or .gz archive and uncompress it using any utility that supports the format, like 7-Zip (http://www.7-zip.org) To configure the sources, you need qmake (from Qt4) or CMake. You need to set the PATH including the directories for Qt4 binaries, MinGW binaries, and also CMake binaries. The program CMakeSetup.exe is the graphic version of CMake for Windows. To use the program in Windows, you need some MIDI synth. It is possible to use the "Microsoft GS Wavetable SW Synth" that cames with XP, but for better performance and quality, you may want to try QSynth/FluidSynth: http://qsynth.sourceforge.net Of course, an external MIDI hardware synth would be an even better approach. To connect VMPK to/from other MIDI programs, you need some virtual MIDI cable software, like MIDI Yoke, Maple, LoopBe1 or Sony Virtual MIDI Router. http://www.midiox.com/myoke.htm http://www.nerds.de/en/loopbe1.html http://www.sonycreativesoftware.com/dl/dl.aspx?dwnid=77 NOTES FOR MAC OSX USERS The build system is configured to create an universal binary (x86+ppc) into an app bundle. You need the Apple development tools and frameworks, as well as the Qt4 SDK from Nokia. Note that VMPK 0.3.x requires the Carbon framework, with the corresponding Carbon version of Qt. To compile VMPK using Makefiles, generated by qmake: $ qmake vmpk.pro -spec macx-g++ $ make $ macdeployqt build/vmpk.app To compile using Makefiles, generated by CMake: $ cmake -G "Unix Makefiles" . $ make To create Xcode project files: $ qmake vmpk.pro -spec macx-xcode or $ cmake -G Xcode . You can use the MIDI synth library that is included in Mac OSX, but a program is needed to do so, like SimpleSynth (http://notahat.com). Also from the same author is MIDI Patchbay. You can use also QSynth for the same price. ACKNOWLEDGMENTS In addition to the aforementioned tools, VMPK uses work from the following open source projects. * from Qtractor, by Rui Nuno Capela http://qtractor.sourceforge.net Instrument definition data classes, Shortcuts editor dialog * from QSynth, by Rui Nuno Capela http://qsynth.sourceforge.net Knob widget * Icon and logo by Theresa Knott http://openclipart.org/media/files/TheresaKnott/346 See AUTHORS for a complete list of acknowledgments Thank you very much. vmpk-0.4.0/man/0000755000175000001440000000000011572642326012303 5ustar pedrousersvmpk-0.4.0/man/CMakeLists.txt0000644000175000001440000000207011572642326015042 0ustar pedrousers# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2011 Pedro Lopez-Cabanillas # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; If not, see . FIND_PROGRAM(XSLTPROC_EXECUTABLE xsltproc) IF(XSLTPROC_EXECUTABLE) MESSAGE(STATUS "XSLTPROC Found: ${XSLTPROC_EXECUTABLE}") INCLUDE(CreateManpages) CREATE_MANPAGES(vmpk.xml) ELSE(XSLTPROC_EXECUTABLE) MESSAGE(STATUS "XSLTPROC NOT Found") INSTALL( FILES vmpk.1 DESTINATION share/man/man1 ) ENDIF(XSLTPROC_EXECUTABLE) vmpk-0.4.0/man/vmpk.xml0000644000175000001440000001713211572642326014006 0ustar pedrousers vmpk"> ]> Mehdi Dogguy dogguy@pps.jussieu.fr 2009 Mehdi Dogguy June 7, 2009 vmpk 1 0.3.3 vmpk User Commands &dhprg; Virtual MIDI Piano Keyboard &dhprg; Standard options... DESCRIPTION This manual page documents briefly the &dhprg; program. This program has standard Qt programs options. Virtual MIDI Piano Keyboard is a MIDI events generator and receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. OPTIONS style sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option stylesheet sets the application styleSheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path. session restores the application from an earlier session. prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time sets the application's layout direction to Qt::RightToLeft sets the backend to be used for on-screen widgets and QPixmaps. Available options are raster and opengl. display sets the X display (default is $DISPLAY). geometry sets the client geometry of the first window that is shown. font defines the application font. The font should be specified using an X logical font description. color sets the default background color and an application palette (light and dark shades are calculated). color sets the default foreground color. color sets the default button color. name sets the application name. title sets the application title. forces the application to use a TrueColor visual on an 8-bit display. count limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used. causes the application to install a private color map on an 8-bit display. sets the input method server (equivalent to setting the XMODIFIERS environment variable) defines how the input is inserted into the given widget, e.g., onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done. LICENSE This manual page was written by Mehdi Dogguy dogguy@pps.jussieu.fr for the Debian GNU/Linux system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation; considering as source code all the file that enable the production of this manpage. vmpk-0.4.0/man/Makefile0000644000175000001440000000037611572642326013751 0ustar pedrousersall: vmpk.1 vmpk.1: vmpk.xml # Verification xmllint --nonet --noout --postvalid --xinclude $^ # Compilation xsltproc --output $@ --nonet --xinclude --xincludestyle \ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl \ $^ vmpk-0.4.0/man/vmpk.10000644000175000001440000001034511572642326013345 0ustar pedrousers.\" Title: vmpk .\" Author: Mehdi Dogguy .\" Generator: DocBook XSL Stylesheets v1.73.1 .\" Date: June 7, 2009 .\" Manual: User Commands .\" Source: vmpk 0.3.3 .\" .TH "VMPK" "1" "June 7, 2009" "vmpk 0\.3\.3" "User Commands" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" vmpk - Virtual MIDI Piano Keyboard .SH "SYNOPSIS" .HP 5 \fBvmpk\fR [Standard\ options\.\.\.] .SH "DESCRIPTION" .PP This manual page documents briefly the \fBvmpk\fR program\. .PP This program has standard Qt programs options\. .PP Virtual MIDI Piano Keyboard is a MIDI events generator and receiver\. It doesn\'t produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external)\. You can use the computer\'s keyboard to play MIDI notes, and also the mouse\. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player\. .SH "OPTIONS" .PP \fB\-style=\fRstyle .RS 4 sets the application GUI style\. Possible values are motif, windows, and platinum\. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the \fB\-style\fR command line option .RE .PP \fB\-stylesheet=\fRstylesheet .RS 4 sets the application styleSheet\. The value must be a path to a file that contains the Style Sheet\. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file\'s path\. .RE .PP \fB\-session=\fRsession .RS 4 restores the application from an earlier session\. .RE .PP \fB\-widgetcount\fR .RS 4 prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time .RE .PP \fB\-reverse\fR .RS 4 sets the application\'s layout direction to \fBQt::RightToLeft\fR .RE .PP \fB\-graphicssystem\fR .RS 4 sets the backend to be used for on\-screen widgets and QPixmaps\. Available options are raster and opengl\. .RE .PP \fB\-display\fR display .RS 4 sets the X display (default is $DISPLAY)\. .RE .PP \fB\-geometry\fR geometry .RS 4 sets the client geometry of the first window that is shown\. .RE .PP \fB\-fn|\-font\fR font .RS 4 defines the application font\. The font should be specified using an X logical font description\. .RE .PP \fB\-bg|\-background\fR color .RS 4 sets the default background color and an application palette (light and dark shades are calculated)\. .RE .PP \fB\-fg|\-foreground\fR color .RS 4 sets the default foreground color\. .RE .PP \fB\-btn|\-button\fR color .RS 4 sets the default button color\. .RE .PP \fB\-name\fR name .RS 4 sets the application name\. .RE .PP \fB\-title\fR title .RS 4 sets the application title\. .RE .PP \fB\-visual TrueColor\fR .RS 4 forces the application to use a TrueColor visual on an 8\-bit display\. .RE .PP \fB\-ncols\fR count .RS 4 limits the number of colors allocated in the color cube on an 8\-bit display, if the application is using the QApplication::ManyColor color specification\. If count is 216 then a 6x6x6 color cube is used (i\.e\. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used\. .RE .PP \fB\-cmap\fR .RS 4 causes the application to install a private color map on an 8\-bit display\. .RE .PP \fB\-im\fR .RS 4 sets the input method server (equivalent to setting the XMODIFIERS environment variable) .RE .PP \fB\-inputstyle\fR .RS 4 defines how the input is inserted into the given widget, e\.g\., onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done\. .RE .SH "LICENSE" .PP This manual page was written by Mehdi Dogguy for the Debian GNU/Linux system (but may be used by others)\. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation; considering as source code all the file that enable the production of this manpage\. .SH "AUTHOR" .PP \fBMehdi Dogguy\fR <\&dogguy@pps\.jussieu\.fr\&> .sp -1n .IP "" 4 .SH "COPYRIGHT" Copyright \(co 2009 Mehdi Dogguy .br vmpk-0.4.0/vmpk.spec.in0000644000175000001440000000346111572642326013772 0ustar pedrousers# # spec file for package vmpk (Version @VERSION@) # # norootforbuild Name: vmpk Version: @VERSION@ Release: 1 License: GPL v3 or later Summary: Virtual MIDI Piano Keyboard Group: Productivity/Multimedia/Sound/Midi Packager: Pedro Lopez-Cabanillas Source: %name-%version.tar.bz2 URL: http://vmpk.sourceforge.net BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: cmake BuildRequires: alsa-devel BuildRequires: libqt4-devel BuildRequires: update-desktop-files %description VMPK is a MIDI event generator/receiver. It doesn't produce any sound by itself, but can be used to drive a MIDI synthesizer (either hardware or software, internal or external). You can use the computer's keyboard to play MIDI notes, and also the mouse. You can use the Virtual MIDI Piano Keyboard to display the played MIDI notes from another instrument or MIDI file player. Authors: -------- Pedro Lopez-Cabanillas %debug_package %prep %setup -q %build CXXFLAGS="$RPM_OPT_FLAGS -g -fexceptions" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} make %{?jobs:-j %jobs} VERBOSE=1 %install make install DESTDIR=$RPM_BUILD_ROOT %suse_update_desktop_file -G "Virtual MIDI Piano Keyboard" %name AudioVideo Midi %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc NEWS README ChangeLog AUTHORS TODO COPYING %doc %{_mandir}/* %dir %{_datadir}/%name %dir %{_datadir}/%name/locale %{_bindir}/%name %{_datadir}/%name/* %{_datadir}/%name/locale/* %{_datadir}/icons/hicolor/*/*/* %{_datadir}/applications/%name.desktop %changelog * Mon Oct 4 2010 Pedro Lopez-Cabanillas 0.3.3 - New release * Fri Jun 18 2010 Pedro Lopez-Cabanillas 0.3.2 - New release vmpk-0.4.0/vmpk.pro0000644000175000001440000001325411572642326013234 0ustar pedrousers# Virtual MIDI Piano Keyboard # Copyright (C) 2008-2011 Pedro Lopez-Cabanillas # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License along # with this program; If not, see . TEMPLATE = app TARGET = vmpk VERSION = 0.4.0 QT += core \ gui \ xml \ svg contains(DEFINES, ENABLE_DBUS) { CONFIG += qdbus DBUS_ADAPTORS += src/net.sourceforge.vmpk.xml } contains(QT_VERSION, ^4\\.[0-5]\\..*) { message("Cannot build VMPK with Qt $${QT_VERSION}") error("Use at least Qt 4.6") } VERSIONH = $$sprintf(const QString PGM_VERSION(\"%1\");,$$VERSION) win32|symbian { system(echo $$VERSIONH > $$OUT_PWD/vmpk_version.h) } else { system(echo \'$$VERSIONH\' > $$OUT_PWD/vmpk_version.h) } simulator|symbian { DEFINES += NETWORK_MIDI DEFINES += SMALL_SCREEN } symbian { LIBS += -lcone -leikcore -lavkon ICON = data/vmpk_symbian.svg TARGET.CAPABILITY += NetworkServices \ UserEnvironment \ LocalServices \ ReadUserData \ WriteUserData TARGET.UID3 = 0x20041DD7 vendorinfo = "%{\"Pedro Lopez-Cabanillas\"}" ":\"Pedro Lopez-Cabanillas\"" addFiles.pkg_prerules = vendorinfo addFiles.path = . addFiles.sources = data/hm.html \ data/hm_es.html \ data/gmgsxg.ins \ qt.conf \ translations/vmpk_cs.qm \ translations/vmpk_de.qm \ translations/vmpk_es.qm \ translations/vmpk_fr.qm \ translations/vmpk_ru.qm \ translations/vmpk_sv.qm DEPLOYMENT += addFiles } win32:!simulator { DEFINES += __WINDOWS_MM__ DEFINES += RAWKBD_SUPPORT LIBS += -lwinmm RC_FILE = src/vpianoico.rc } win32:simulator: LIBS += -lws2_32 linux*:!simulator { DEFINES += __LINUX_ALSASEQ__ DEFINES += AVOID_TIMESTAMPING DEFINES += RAWKBD_SUPPORT CONFIG += link_pkgconfig x11 PKGCONFIG += alsa LIBS += -lpthread } macx { CONFIG += x86 \ ppc ICON = data/vmpk.icns DEFINES += __MACOSX_CORE__ DEFINES += RAWKBD_SUPPORT BUNDLE_RES.files = data/help.html \ data/help_de.html \ data/help_es.html \ data/help_fr.html \ data/help_nl.html \ data/help_ru.html \ data/gmgsxg.ins \ data/spanish.xml \ data/german.xml \ data/azerty.xml \ data/it-qwerty.xml \ data/vkeybd-default.xml \ data/pc102mac.xml \ qt.conf \ $$[QT_INSTALL_TRANSLATIONS]/qt_cs.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_de.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_es.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_fr.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_ru.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_sv.qm \ $$[QT_INSTALL_TRANSLATIONS]/qt_zh_CN.qm \ $$OUT_PWD/vmpk_cs.qm \ $$OUT_PWD/vmpk_de.qm \ $$OUT_PWD/vmpk_es.qm \ $$OUT_PWD/vmpk_fr.qm \ $$OUT_PWD/vmpk_nl.qm \ $$OUT_PWD/vmpk_ru.qm \ $$OUT_PWD/vmpk_sv.qm \ $$OUT_PWD/vmpk_zh_CN.qm BUNDLE_RES.path = Contents/Resources QMAKE_BUNDLE_DATA += BUNDLE_RES LIBS += -framework \ CoreMidi \ -framework \ CoreAudio \ -framework \ CoreFoundation \ -framework \ Carbon } irix* { CONFIG += x11 DEFINES += __IRIX_MD__ DEFINES += RAWKBD_SUPPORT LIBS += -laudio \ -lpthread } debug:DEFINES += __RTMIDI_DEBUG__ INCLUDEPATH += src # Input FORMS += src/about.ui \ src/extracontrols.ui \ src/midisetup.ui \ src/preferences.ui \ src/riffimportdlg.ui \ src/vpiano.ui HEADERS += src/about.h \ src/classicstyle.h \ src/constants.h \ src/events.h \ src/extracontrols.h \ src/instrument.h \ src/keyboardmap.h \ src/keylabel.h \ src/knob.h \ src/mididefs.h \ src/midisetup.h \ src/pianodefs.h \ src/pianokeybd.h \ src/pianokey.h \ src/pianoscene.h \ src/preferences.h \ src/qticonloader.h \ src/rawkeybdapp.h \ src/riff.h \ src/riffimportdlg.h \ src/RtError.h \ src/RtMidi.h \ src/vpiano.h SOURCES += src/about.cpp \ src/classicstyle.cpp \ src/extracontrols.cpp \ src/instrument.cpp \ src/keyboardmap.cpp \ src/keylabel.cpp \ src/knob.cpp \ src/main.cpp \ src/midisetup.cpp \ src/pianokeybd.cpp \ src/pianokey.cpp \ src/pianoscene.cpp \ src/preferences.cpp \ src/qticonloader.cpp \ src/riff.cpp \ src/riffimportdlg.cpp \ src/RtMidi.cpp \ src/udpmidi.cpp \ src/vpiano.cpp !symbian:!simulator { FORMS += src/kmapdialog.ui \ src/shortcutdialog.ui HEADERS += src/kmapdialog.h \ src/shortcutdialog.h SOURCES += src/kmapdialog.cpp \ src/shortcutdialog.cpp \ src/rawkeybdapp.cpp } RESOURCES += data/vmpk.qrc TRANSLATIONS += translations/vmpk_cs.ts \ translations/vmpk_de.ts \ translations/vmpk_es.ts \ translations/vmpk_fr.ts \ translations/vmpk_nl.ts \ translations/vmpk_ru.ts \ translations/vmpk_sv.ts \ translations/vmpk_zh_CN.ts include(updateqm.pri)